2016-07-27 21 views
0

Ich verwende AFHTTPRequestOperation, um eine große Datei in das Documents-Verzeichnis auf meinem Gerät herunterzuladen.AFHTTPRequestOperation ruft NSPOSIXErrorDomain ab "Keine solche Datei oder Verzeichnis"

NSURLRequest *request = [NSURLRequest requestWithURL:vectorFile.url]; 
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

NSString *path = [self pathForFileName:vectorFile.fileName]; 
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 

    double percentDone = (double)totalBytesRead/(double)totalBytesExpectedToRead; 
    progress(percentDone, totalBytesRead, totalBytesExpectedToRead); 

}]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

     NSString *path = [self pathForFileName:vectorFile.fileName]; 

     extracting(); 
     [SSZipArchive unzipFileAtPath:path toDestination:[self path] progressHandler:^(NSString *entry, unz_file_info zipInfo, long entryNumber, long total) { 

      NSLog(@"Unzipping"); 

     } completionHandler:^(NSString *path2, BOOL succeeded, NSError *error) { 

      if (!error) { 
       NSLog(@"Successfully downloaded file to %@", path); 


       dispatch_async(dispatch_get_main_queue(), ^{ 

        completion(YES); 

       }); 
      } else { 

       NSLog(@"%@", error); 
       failure(error); 

      } 


     }]; 

    }); 


} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { 

    NSLog(@"%@", error); 
    failure(error); 

}]; 
[operation start]; 

Aus irgendeinem seltsamen Grund, es funktioniert auf dem Simulator zum Download der Dateien, sondern auf dem Gerät (iPhone 6) ich folgende Fehlermeldung erhalten:

Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory" 

Die URL ist richtig, wie Es wird in meinem Browser korrekt und im Simulator heruntergeladen. Warum würde das nur auf dem Gerät passieren? Und was könnte das verursachen?

Ich habe versucht, mein Gerät neu zu starten und Netzwerkeinstellungen zurückzusetzen.

+0

Drei häufige Ursachen für Probleme zwischen Simulator und Gerät sind: (a) Versuchen, zu bündeln; (b) Groß-/Kleinschreibung (macOS ist im Allgemeinen nicht case sensitive; iOS ist); und (c) versuchen, auf Dateien außerhalb der Sandbox zuzugreifen. Wenn Sie uns zeigen, was der Pfad ist, können wir möglicherweise diagnostizieren, was vor sich geht. – Rob

+0

@Rob - Sie möchten den Downloadpfad oder den Pfad, in den ich die Datei schreibe, wissen? –

+0

@Rob - Du hattest Recht! Ich habe darauf geachtet, das Verzeichnis zuerst zu erstellen, bevor es streamt und das hat das Problem behoben! Möchten Sie das als Antwort hinzufügen? –

Antwort

1

Nach Hilfe einen Kommentar hier, habe ich herausgefunden, dass ich zuerst überprüfen erforderlich, dass mein Zielverzeichnis erstellt worden ist:

if(![[NSFileManager defaultManager] fileExistsAtPath:[self path]]) { 
    [[NSFileManager defaultManager] createDirectoryAtPath:[self path] withIntermediateDirectories:YES attributes:nil error:NULL]; 
} 

Ich hatte angenommen, dass die outputStream es für mich geschaffen hätte. Und das Seltsame ist, dass es im Simulator richtig funktioniert hat.

1

Dieser Fehler (Keine solche Datei oder das Verzeichnis) kann auch, wenn Sie [NSURLSessionConfiguration backgroundConfiguration]

In iOS 10 zumindest mit ausgelöst werden, wenn Sie versuchen, diese Aufgaben wieder verwenden, was resumeData ist, wird Ihre Sitzung Delegierten zurückrufen Dieser Fehler.

Nicht sicher, was sich seit iOS 9 geändert hat, da dies in iOS 7-9 ordnungsgemäß funktionierte.

+0

wie man es vermeidet? –

+0

Ich lösche die resumeData und beginne einfach von vorne. Hatte keine Zeit, tiefer zu graben, das funktionierte. –