スレッドを使ってユーザインターフェースの応答性を稼ごうとするとき、スレッドセーフでないものに対しては配慮が必要で、それに関する情報を見かけたときにここにまとめておく。(見つけるたびに記載するので網羅した一覧ではない。)
Cocoa でのガイドライン
- Threading Programming Guide 2010-04-28
- Thread Safety Summary
Cocoa を使う場合でのガイドラインは、
- Immutable objects は基本的にはスレッドセーフ。逆に言えば、Mutable objects はスレッドセーフではない。詳細は “Mutable Versus Immutable” 参照。
- スレッドセーフでないと見なされるオブジェクトは、複数スレッドから使用されるときにスレッドセーフではない。多くのオブジェクトは、一時期にあるスレッドで使用される限りは、問題ない。
- アプリケーションのメインスレッドはイベント処理に責任を持つ。Although the Application Kit continues to work if other threads are involved in the event path, operations can occur out of sequence.
- ビューへの描画にスレッドを使用するときは、NSView の lockFocusIfCanDraw と unlockFocus との間で行う必要がある。
- Cocoa とともに POSIX スレッドを使用するときは、最初に Cocoa をマルチスレッドの状態におく必要がある。詳細は “Using POSIX Threads in a Cocoa Application” 参照。
Core Data
- Core Data Programming Guide 2012-09-19
- Concurrency with Core Data
- Use Thread Confinement to Support Concurrency
- Track Changes in Other Threads Using Notifications
- ThreadedCoreData サンプル
thread confinement(スレッド拘束?)つまり、各スレッドが managed object context を完全に独立して持つことが必要。そのために、
- persistent store coordinator を共有し、各スレッドが managed object context を独立して持つ
- 各スレッドで、persistent store coordinator および managed object context を独立して持つ
ある managed object context での変更は他へは refetch や re-fault しない限りは伝達されないので、notification によって変更を反映する。(以下、省略。)
ユーザインターフェース
各ドキュメントで確認する必要があるが、以下に記述あり。
- Core Data Programming Guide 2012-09-19
- Concurrency with Core Data
AppKit や UIKit はスレッドセーフでない、特に、OS X Cocoa bindings や controllers はスレッドセーフでない。