2016-07-27 1 views
0

J'utilise AFHTTPRequestOperation pour télécharger un fichier volumineux dans le répertoire Documents de mon périphérique.AFHTTPRequestOperation obtient NSPOSIXErrorDomain "Aucun fichier ou répertoire"

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]; 

Pour une raison étrange, il fonctionne sur le simulateur pour télécharger les fichiers, mais sur l'appareil (iPhone 6) Je reçois l'erreur suivante:

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

L'URL est correcte, comme il télécharge dans mon navigateur correctement et dans le simulateur. Pourquoi cela se passerait-il sur l'appareil? Et qu'est-ce qui pourrait en être la cause?

J'ai essayé de redémarrer mon appareil et de réinitialiser les paramètres réseau.

+0

Trois sources communes de problèmes entre le simulateur et le périphérique incluent: (a) essayer d'écrire en bundle; (b) sensibilité à la casse (macOS n'est généralement pas sensible à la casse, iOS est); et (c) essayer d'accéder aux fichiers en dehors du bac à sable. Si vous nous montrez ce que le chemin était, nous pourrions être en mesure de diagnostiquer ce qui se passe. – Rob

+0

@Rob - Vous voulez connaître le chemin de téléchargement ou le chemin vers lequel j'écris le fichier? –

+0

@Rob - Tu avais raison! Je me suis assuré de créer le répertoire avant le streaming et cela a corrigé le problème! Voulez-vous ajouter cela comme réponse? –

Répondre

1

Après l'aide d'un commentaire ici, je compris que je devais vérifier d'abord que mon répertoire de destination a été créé:

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

J'avais supposé que le outputStream aurait créé pour moi. Et la chose même étrange est que cela a fonctionné correctement dans le simulateur.

1

Cette erreur (Aucun fichier ou répertoire) peut également être levée si vous en utilisant [NSURLSessionConfiguration backgroundConfiguration]

Dans iOS 10 au moins, si vous essayez de reprendre ces tâches en utilisant toutes resumeData est là, votre session appel délégué retour cette erreur.

Vous ne savez pas ce qui a changé depuis iOS 9, puisque cela fonctionnait correctement dans iOS 7-9.

+0

comment l'éviter? –

+0

J'efface le resumeData et je recommence à zéro. N'a pas eu le temps de creuser plus profond, cela a fonctionné. –