2016-07-27 3 views
0

Я использую AFHTTPRequestOperation для загрузки большого файла в папку «Документы» на моем устройстве.AFHTTPRequestOperation получение NSPOSIXErrorDomain «Нет такого файла или каталога»

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

По какой-то странной причине, он работает на тренажере для загрузки файлов, но на устройстве (iPhone 6) Я получаю следующее сообщение об ошибке:

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

URL-адрес является правильным, так как он загружается в моем браузере правильно и в Simulator. Почему это просто происходит на устройстве? И что может быть причиной?

Я попытался перезагрузить свое устройство и сбросить настройки сети.

+0

Три общих источника проблем между симулятором и устройством включают (а) попытку записи в пучок; (b) чувствительность к регистру (macOS обычно не чувствителен к регистру, iOS); и (c) попытки доступа к файлам вне песочницы. Если вы покажете нам, что такое путь, мы можем диагностировать, что происходит. – Rob

+0

@Rob - Вы хотите узнать путь загрузки или путь, к которому я пишу файл? –

+0

@Rob - Вы были правы! Я постарался создать каталог перед потоковой передачей и устранить проблему! Хотите добавить это в качестве ответа? –

ответ

1

После помощи комментарий здесь, я понял, что мне нужно сначала проверить, что мой целевой каталог был создан:

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

Я предположил, что outputStream бы создал его для меня. И даже странно, что он правильно работал в симуляторе.

1

Эта ошибка (Нет такого файла или каталога) также может быть выброшен, если вы используете [NSURLSessionConfiguration backgroundConfiguration]

В прошивкой 10, по крайней мере, если вы пытаетесь возобновить такие задачи, используя любые resumeData там, сеанс Делегат вызов возвратит эта ошибка.

Не знаете, что изменилось с iOS 9, так как это правильно работало в iOS 7-9.

+0

, как этого избежать? –

+0

Я очищаю resumeData и начинаю сначала. Не успел копать глубже, это сработало. –