アプリでdispatch_asyncを使用してGoogle API呼び出しを行い、解析しているJSON結果を取得しています。解析した JSON 応答からの結果の数に応じて更新されるように、進行状況ビューを実装したいと考えています。
したがって、私のdispatch_async Google API呼び出しは次のとおりです。
dispatch_async(myQueue, ^{
NSData* data1 = [NSData dataWithContentsOfURL:googleURL];
[self performSelectorOnMainThread:@selector(fetchResultsForGoogle:) withObject:data1 waitUntilDone:YES];
});
私のfetchResultsForGoogle: withObject:
メソッドは結果を解析し、処理された結果の数とともに進行状況ビューを画面に表示したいと考えています。したがって、fetchResultsForGoogle...
メソッド内で、次のものが必要です。
float percentage = (float)counter/(float)totalItems;
self.progressView.progress = percentage;
NSString *percentText = [NSString stringWithFormat:@"%f %% %@", percentage, @" complete"];
self.progressViewLabel.text = percentText;
しかし、dispatch_async が別のスレッドで実行されている場合、を使用せずにメイン スレッドのビューを更新できないことを理解していると思いますdispatch_async(dispatch_get_main_queue()
。これを解決するために、これを実装する 2 つの方法 (以下を参照) を試しましたが、どちらの方法もうまくいきません (progressView
まったくprogressViewLabel
更新されません)。
プランA:
dispatch_async(myQueue, ^{
NSData* data1 = [NSData dataWithContentsOfURL:googleURL];
[self performSelectorOnMainThread:@selector(fetchResultsForGoogle:) withObject:data1 waitUntilDone:YES];
dispatch_async(dispatch_get_main_queue(), ^{
float percentage = (float)counter/(float)totalItems;
self.progressView.progress = percentage;
NSString *percentText = [NSString stringWithFormat:@"%f %% %@", percentage, @"complete"];
NSLog(@"Percentage: %@", percentText);
self.progressViewLabel.text = percentText;
});
});
次の手段:
dispatch_async(myQueue, ^{
NSData* data1 = [NSData dataWithContentsOfURL:googleURL];
[self performSelectorOnMainThread:@selector(fetchResultsForGoogle:) withObject:data1 waitUntilDone:YES];
});
そしてfetchResultsForGoogle...
メソッド内:
dispatch_async(dispatch_get_main_queue(), ^{
float percentage = (float)counter/(float)totalItems;
self.progressView.progress = percentage;
NSString *percentText = [NSString stringWithFormat:@"%f %% %@", percentage, @"complete"];
NSLog(@"Percentage: %@", percentText);
self.progressViewLabel.text = percentText;
});
したがって、これを実装する正しい方法に関するアイデアやヒントは大歓迎です!
EDIT-SOLVED IT
修正しました。ブロックではdispatch_async
、 に渡していましたperformSelectorOnMainThread
。そのため、 で進行状況ビューを更新しようとしたときに完了performSelectorOnMainThread
するまで UI が更新されませんdispatch_async
そのため、ブロックperformSelectorInBackgroundThread
内に変更したところ、UI が適切に更新されるようになりました。dispatch_async
performSelectorOnMainThread
私はこれらすべてに慣れていませんが、まだ新しいことを学んでいることをうれしく思います。