これは機能しますが、少しアンチパターンです。メソッドが呼び出されたスレッドがメインスレッドでない場合、私が行うことはエラーをスローすることです。メソッドが正しいスレッドで呼び出されるようにするのは呼び出し元の責任です。これらの種類のハッキングは、醜いコードを助長するだけです。さらに、これに依存している場合、このメソッドを呼び出すたびに、突然、メッセージディスパッチのオーバーヘッドが2倍になります。
発信者の動作を本当に変更できない場合は、次のことを試すことができます。
-(void)methodToBeRunOnMainThreadWithObj:(id)object {
dispatch_sync(dispatch_get_main_queue(), ^{
// code goes here
});
}
これにより、ディスパッチブロック内のすべてのコードがメインスレッドで実行され、メソッドは完了するまで戻りません。メソッドをすぐに返す場合は、代わりに使用できますdispatch_async
。を使用するdispatch_sync
と、void以外の戻り型を持つメソッドでもこのトリックを使用できます。
このコードには、非オブジェクト型(int
など)の引数を持つメソッドをサポートするという追加の利点もあります。また、任意の数の引数を持つメソッドをサポートしますが、performSelector:withObject:
その兄弟メソッドは限られた数の引数のみをサポートします。別の方法はオブジェクトを設定するNSInvocation
ことであり、それらは面倒です。
これには、プラットフォームにGrand Central Dispatch(GCD)が必要であることに注意してください。