いくつかのこと:
重要な観察事項は、dispatch_async
必要な場合を除き、常に使用することですdispatch_sync
。ここでは同期操作は必要ないのでdispatch_async
、UI の更新に使用してください。
メイン キューから実行addProcess
している場合、最初の UI 更新をメイン キューにディスパッチする必要はありません。明らかに、これをバックグラウンド キューから実行している場合は実行します。
元の質問には、 内のバックグラウンド キューへのディスパッチがありましたaddProcess
。これは、私にとってより理にかなっています (すべての GCD を適切にカプセル化したままにします)。あなたはこれを経由して呼び出していると言うように回答を更新しましたdispatch_async([self addProcess])
(これは、メインキューではなくグローバルキューを意味していると思います)。以下のコード サンプルでは、両方のシナリオに対応しています。
したがって、要するに、[self addProcess]
(それ自体をバックグラウンド キューにディスパッチせずに) 経由でこれを呼び出す場合は、次のことをお勧めします。
- (void) addProcess:(NSString *)searchTerm
{
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//DO SOME VERY LONG STUFF HERE
dispatch_async(dispatch_get_main_queue(), ^{
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = NO;
[SVProgressHUD dismiss];
});
});
}
または、代わりに、
- (void) addProcess:(NSString *)searchTerm
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient];
});
//DO SOME VERY LONG STUFF HERE
dispatch_async(dispatch_get_main_queue(), ^{
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = NO;
[SVProgressHUD dismiss];
});
});
}
そして、あなたがやっているなら...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self addProcess];
});
それはただです:
- (void) addProcess:(NSString *)searchTerm
{
dispatch_async(dispatch_get_main_queue(), ^{
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient];
});
//DO SOME VERY LONG STUFF HERE
dispatch_async(dispatch_get_main_queue(), ^{
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = NO;
[SVProgressHUD dismiss];
});
}