3

問題

NSURLConnection オブジェクトを生成するAFNetworkingを使用して写真をアップロードしています。

NSURLConnection は、への呼び出しを行っていません

- (void)connection:(NSURLConnection __unused *)connection
   didSendBodyData:(NSInteger)bytesWritten
 totalBytesWritten:(NSInteger)totalBytesWritten
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite

方法。(これはNSURLConnection.hで定義されたNSURLConnectionDataDelegate プロトコルの一部です)

リクエストは、写真が添付された HTTP POST リクエストです (Content-Disposition "form-data"、Mime タイプ "image/jpeg")。これにより、アップロードが進行するにつれて、このメソッドが定期的に呼び出されるようになるはずです。

プログレスバーをユーザーに表示するメソッドが必要です。ただし、メソッドは呼び出されていません。

ノート:

  • デリゲートが適切に設定されています。他のデリゲート メソッドが呼び出される
  • ファイルのアップロードが成功しました

AFNetworking コード

これは、AFNetworking の問題ではなく、NSURLConnection の問題であると確信しています。

ただし、念のため、AFHTTPClientサブクラスの関連コードを次に示します。

NSMutableURLRequest *request = [self multipartFormRequestWithMethod:@"POST" path:path parameters:parameters constructingBodyWithBlock:constructor];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];

if (constructor) {
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
        NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
    }];
}

[self enqueueHTTPRequestOperation:operation];

私の AFHTTPClient サブクラスは、呼び出しているメソッドのいずれもオーバーライドしません。

  • multipartFormRequestWithMethod: path: parameters: constructingBodyWithBlock:
  • HTTPRequestOperationWithRequest: success: failure:
  • setUploadProgressBlock:
  • enqueueHTTPRequestOperation:

constructorタイプを持つブロックで(void (^)(id<AFMultipartFormData>))あり、そうではありませんnil(コードをステップ実行することで検証されます)。

デバッガーに入力すると、ブロックが正しく設定されていることがpo operation.uploadProgressわかります。$0 = 0x1301d9f0 <__NSMallocBlock__: 0x1301d9f0>

ファイルは常に正常にアップロードされますが、アップロード進行状況ブロックのコードが実行されないため、進行状況バーが更新されません。

質問

NSURLConnection がこのメソッドを呼び出さないのはなぜですか?

NSURLConnection が想定される状況はどのようなものですか? (十分に文書化されていないようです。)

そして最も重要なのは、アップロードの進行状況をユーザーに表示するにはどうすればよいですか?

4

2 に答える 2

3

サードパーティのエラー報告ライブラリが、NSURLConnection でデリゲート メソッドをオーバーライドしていました。ライブラリを削除すると、問題が解決しました。(AFNetworking または NSURLConnection のいずれにも問題はありませんでした。)

この問題をより迅速に特定するためのトラブルシューティング手順を提供していただければ、報奨金を差し上げます。(サードパーティ ライブラリはコンパイル済みであるため、ソース コード検索は機能しないことに注意してください。)

于 2013-02-15T17:25:09.797 に答える
1

ライブラリconnection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:は、のカテゴリにメソッドを実装している可能性がありますNSObject。それは非常に厄介ですが、それはのメソッドがAFURLConnectionOperation呼び出されない理由を説明することができます。

この仮定を確認するために、コンパイルされたバイナリに対してclass-dumpを実行できます。出力で検索しdidSendBodyData:ます。カテゴリに一致するものがある場合、ライブラリは明らかに責任があります。ライブラリがObjective-Cランタイムをいじっている可能性もありますが、それは単にclass-dumpを実行するよりも検出が難しいでしょう。

于 2013-02-21T15:39:11.820 に答える