0

私はObjective-cが初めてで、トークンを含むURLリクエストをサーバーに送信してファイルをダウンロードしたいと考えています。トークンが無効な場合、サーバーは HTTP 500 エラーを返します。

しかし、操作がエラーを返しても、ファイルはまだ作成されていますが、ファイルの内容はエラーメッセージです。私の期待は、操作がエラーになった場合、ファイルを作成してダウンロードするべきではありません。説明が下手でごめんなさい...

以下は私のコードです。

- (void)attemptResourceFileWithToken:(NSString*)token
                            from:(NSString*)url
                              to:(NSString*)targetPath
               completionHandler:(void (^)(NSError*))handler {

//create an NSURL object, which is used to make an NSURLRequest.
NSString *string = [NSString stringWithFormat:@"%@&token=%@", url, token];
NSURL *requestUrl = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:requestUrl];
DLog(@"Request URL: %@", requestUrl);

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:targetPath append:NO]];
DLog(@"Target file path: %@", targetPath);

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    DLog(@"Successfully get the response from server");
    handler(nil);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    DLog(@"ERR: %@", [error description]);
    handler(error);
}];

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    DLog(@"Downloading %ld of %lld bytes", (long) totalBytesRead, totalBytesExpectedToRead);
}];

[operation start];

}

  1. setOutputStream は、ファイルをターゲット パスに保存します。
  2. 操作が正常に完了した場合、ハンドラは nil を返します
  3. 操作が失敗した場合は、エラーを返します。

3 (操作が失敗) の場合、ステップ 1 setOutputSteam がキャンセルされるか、ファイルを保存しないようにするために私ができること。

4

1 に答える 1

0

outputStream は一時バッファのようなものであるため、得られる結果は予期されたものです。公式ドキュメントから:

要求が終了するまで受信したデータを書き込むために使用される出力ストリーム。

デフォルトでは、データはバッファに蓄積され、リクエストの完了時に responseData に格納され、中間の outputStream プロパティは nil に設定されます。outputStream が設定されている場合、データは内部バッファーに蓄積されないため、完了したリクエストの responseData プロパティは nil になります。出力ストリームは、設定時にネットワーク スレッドの実行ループでスケジュールされます。

あなたがすべきことは、outputStream によって生成されたファイルを一時的なものとして扱うことです。成功のコールバックでは、それをより永続的な場所に移動する必要があります (場合によっては名前を変更します)。エラー コールバックでは、単純に削除できます。

別の方法は、outputStream をまったく設定せずに、responseObject を保存しようとすることです。私は自分の PC の ATM にいないので、その解決策についてのヒントをまだ提供できません。

これはあなたと同様の質問です。受け入れられた回答のコメントに注意してください-リンク

于 2015-04-10T07:44:20.303 に答える