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: 画像のアップロード応答