別のスレッドでメソッドを再呼び出しするのではなく、を使用して、機密性の高いコードだけがメインスレッドにあることを確認することdispatch_sync()
をお勧めします。これは、 「メインスレッドでタスクを実行するGCD」に対するBrad Larsonの回答のdispatch_get_main_queue()
ように、関数で簡単にラップできます。
彼の手順は基本的にあなたがすでに持っているものと同じですが、違いはコードがブロックに入れられ、必要に応じて呼び出されるか、キューに入れられることです。
if ([NSThread isMainThread])
{
blockContainingUICode();
}
else
{
dispatch_sync(dispatch_get_main_queue(), blockContainingUICode);
}
必要に応じて、これを問題なくマクロに変換することもできます。
ブロック自体を作成するのに、多くの変更は必要ありません。UIコードが次のようになっている場合:
[[self textLabel] setText:name];
[[self detailTextLabel] setText:formattedDollarValue];
[[self imageView] setImage:thumbnail];
エンキューするブロックに入れると、次のようになります。
dispatch_block_t blockContainingUICode = ^{
[[self textLabel] setText:mainText];
[[self detailTextLabel] setText:detailText];
[[self imageView] setImage:thumbnail];
};