AFHTTPRequestOperation获取NSPOSIXErrorDomain“没有这样的文件或目录”

时间:2016-07-27 21:45:48

标签: ios objective-c afnetworking afhttprequestoperation

我正在使用AFHTTPRequestOperation将大文件下载到我设备上的Documents目录中。

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"

网址正确,因为它在我的浏览器中正确下载并在模拟器中。为什么这只是在设备上发生?可能导致什么呢?

我尝试重启设备并重置网络设置。

2 个答案:

答案 0 :(得分:2)

如果您使用[NSURLSessionConfiguration backgroundConfiguration]

,也可能抛出此错误(没有此类文件或目录)

至少在iOS 10中,如果尝试使用resumeData恢复此类任务,则会话委托调用将返回该错误。

不确定自iOS 9以来发生了什么变化,因为它在iOS 7-9中正常运行。

答案 1 :(得分:1)

在这里发表评论之后,我发现我需要首先检查我的目的地目录是否已经创建:

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

我原以为outputStream会为我创造它。甚至奇怪的是它在模拟器中正常工作。