可能性の重複:
Grand Central Dispatch (GCD) vs. performSelector - need a better explanationdispatch_asyncまたはperformSelectorOnMainThreadを使用してメインスレッドでUI変更を実行しますか?
メインスレッド上で "もの" を実行するために、私はdispatch_async
またはperformSelectorOnMainThread
を使用する必要がありますか?適切な方法、正誤、またはベストプラクティスがありますか?
例:NSURLConnection sendAsynchronousRequest:urlRequest
メソッドのブロック内でロジックを実行しています。私がUIAlertView
を提示するなどのメインビューには何かをしているので、私はUIAlertView
をメインスレッドに示す必要があります。これを行うには、次のコードを使用しています。
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
// code snipped out to keep this question short
if(![NSThread isMainThread])
{
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"Some Message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
});
}
}];
同じif(![NSThread isMainThread])
の文では、カスタムメソッドをいくつか呼び出します。問題は、上記の私が使用しているdispatch_async
メソッドを使用するか、代わりにperformSelectorOnMainThread
を使用する方が良いでしょうか?例えば、以下の完全なコードは:
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
// code snipped out to keep this question short
if(![NSThread isMainThread])
{
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"Some Message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
// call custom methods in dispatch_async?
[self hideLoginSpinner];
});
// or call them here using performSelectorOnMainThread???
[self performSelectorOnMainThread:@selector(hideLoginSpinner) withObject:nil waitUntilDone:NO];
}
}];
FYI - 私は彼のメインスレッド上でこれらのアクションを実行しない場合UIAlertView
を提示するとき、私は数秒の遅延を見て、私は、デバッガwait_fences: failed to receive reply: 10004003
に次のメッセージが表示されます。私はこれが主なスレッドのUIに変更を加える必要があることを学んだ...誰かがなぜ私がやっていることをやっているのだろうかと疑問に思っている場合...
は密接に関連:[performSelectorOnMainThreadの違いは何?:メインキュー上とdispatch_asyncは、()](http://stackoverflow.com/questions/9335434/) –
_writing_コードのPOVから最も明白な違いブロックをディスパッチする方が柔軟性があります。たとえば、プリミティブな引数を扱う方が簡単です。 –