2011-10-11 11 views
5

Cocoa Touchでは、UI要素をバックグラウンドスレッドから更新すると、悪いことが起こります。Cocoa Touch/UIKitでは、バックグラウンドスレッドからユーザーインターフェイスへの変更を検出する方法はありますか?

問題は、いつも起こるわけではないので、軽い背景のUI干渉が、歯の中であなたの右をキックするまでしばらく気づかないかもしれないということです。

UIKitをペディティックモードで実行する方法はありますか?誰かがバックグラウンドスレッドから要素を更新するとすぐに、コンソールに何かがクラッシュまたはログを記録しますか?

答えて

2

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インタフェースオブジェクトを、プロキシを介してラップすることです(起動時にうねりをつけますか?)、メインスレッドで使用されていないかどうかをアサートします。これらのプロキシ/スウィズルは、デバッグビルドやシミュレータ環境でのみ発生するため、実際のリリースが遅れることはありません。私はこれをやっていると考えました...しかし、適切に行うには痛みのように見えます。

関連する問題