1

Im my App には、画像を Web サーバーにアップロードする機能があります。これがバックグラウンドで行われている間、進行状況バーを設定して、ユーザーがアップロードのステータスを確認できるようにします。以下に示すように、進行状況バーをアップロードしています。他の HTTP 要求が行われない限り、すべてが正常に機能します。別のリクエストが行われるとすぐに setUploadProgressBlock は更新を停止しますが、最終的に setCompletionBlockWithSuccess が呼び出されるため、進行状況バーは 30 から 70 の間のパーセンテージになりますが、アップロードは実際には終了しています。他のリクエストについては、AFNetworking を使用していません。以下にも例があります。[operation waitUntilFinished] とオンラインで見た他のいくつかの例を呼び出してみましたが、何も機能していないようです。

画像のアップロード =

NSData *postData= [[NSString stringWithFormat:@"description=%@&location=%@&image=%@",i, l, d] dataUsingEncoding:NSNonLossyASCIIStringEncoding allowLossyConversion:YES];

NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@"%@/upload/create", SERVICE_URL]];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody:postData];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:theRequest];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
    NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);

        float percentDone = ((float)(totalBytesWritten) / (float)(totalBytesExpectedToWrite));

        [progressLabel setText:[NSString stringWithFormat:@"%.0f%%", (percentDone * 100)]];
        [progressView setProgress:percentDone];

}];

[operation  setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"success: %@", operation.responseString);

}
  failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      NSLog(@"error: %@",  operation.responseString);

  }
 ];
[httpClient enqueueHTTPRequestOperation:operation];

その他のすべてのリクエスト =

NSURL *loginURL = [NSURL URLWithString: [NSString stringWithFormat:@"%@/user/add", SERVICE_URL]];

        NSData *postData= [[NSString stringWithFormat:@"user_id=%@", user_id] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

        NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:loginURL];
        [theRequest setHTTPMethod:@"POST"];
        [theRequest setHTTPBody:postData];

        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        [NSURLConnection sendAsynchronousRequest:theRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
         {


         }];

アップデート:

もう少し説明するために、このプロセスを通じてコン​​ソールがどのように見えるかの例を次に示します -

769069 バイト中 437568 バイトを送信

別の API 呼び出しが送信されました

プログレスバーの更新が止まる

別の API 呼び出し応答

success: 画像のアップロード応答

4

3 に答える 3

1

操作が完了する前に、所有されていない HTTP クライアント インスタンスの割り当てが解除されている可能性があります。例に示されている静的なシングルトン パターンを使用するstrongか、所有するビュー コントローラーのプロパティに格納します。

于 2013-07-24T16:18:10.060 に答える
0

ASIHTTPRequest ( http://allseeing-i.com/ASIHTTPRequest/ ) に切り替えて、アップロードの進行状況を取得し、問題を解決しました!

于 2013-07-21T15:13:18.187 に答える