2016-07-27 3 views
0

私はAFHTTPRequestOperationを使用して、大きなファイルを自分のデバイスのDocumentsディレクトリにダウンロードしています。いくつかの奇妙な理由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が正しいか、など私のブラウザに正しく、シミュレータでダウンロードされます。なぜこれはデバイス上で起こっているのでしょうか?それを引き起こす原因は何ですか?

私はデバイスの再起動とネットワーク設定のリセットを試みました。ヘルプの後

+0

シミュレータとデバイスの間の3つの共通の問題の原因には、(a)バンドルに書き込むこと、 (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

このエラー(そのようなファイルやディレクトリはありませんが)また、あなたが、少なくともiOSの10で[NSURLSessionConfiguration backgroundConfiguration]

を使用している場合、あなたがresumeDataがあるものは何でも使って、このような作業を再開しようとした場合、セッションデリゲートの呼び出しが返されますスローすることができますそのエラー。

iOS 9以降で何が変更されたかわかりません。これはiOS 7-9で正しく動作していたためです。

+0

これを回避するにはどうすればよいですか? –

+0

私はresumeDataをクリアしてからやり直します。深く掘り下げる時間がなかった、これは働いた。 –

関連する問題