UIの更新を行う前に、メインスレッドで何かをしているかどうかを確認できます。私は自分自身に次のマクロを書いた:
/// Stick this in code you want to assert if run on the main UI thread.
#define DONT_BLOCK_UI() \
NSAssert(![NSThread isMainThread], @"Don't block the UI thread please!")
/// Stick this in code you want to assert if run on a background thread.
#define BLOCK_UI() \
NSAssert([NSThread isMainThread], @"You aren't running in the UI thread!")
私はグループに方法Aは、いくつかの処理を行い、その後、UIの更新を行う方法Bを、呼び出す方法で私のコードを傾向があります。メソッドBの始めに、BLOCK_UI()マクロをスティックします。このマクロは、UIで実行されていない場合にアサートします。また、長時間実行されているタスクの場合は、他のマクロを使用します。私はこれらのマクロとよりランダムなものをhttps://github.com/gradha/ELHASO-iOS-snippetsに入れました。これは役に立つかもしれません。
これらのマクロは、残念なことにそれらを使用する際に規律を必要とします。そのような状況に対処するより侵略的な方法は、すべてのSDKインタフェースオブジェクトを、プロキシを介してラップすることです(起動時にうねりをつけますか?)、メインスレッドで使用されていないかどうかをアサートします。これらのプロキシ/スウィズルは、デバッグビルドやシミュレータ環境でのみ発生するため、実際のリリースが遅れることはありません。私はこれをやっていると考えました...しかし、適切に行うには痛みのように見えます。