マルチスレッドとCoreData
タイムラインで見かけたので、自分の用のメモとしてまとめました。
CoreDataの処理ってバックグラウンドに回せない部分があったよーな気がするけどどーなんやろ。
— Sumihiro Ueda/上田澄博 ✅さん (@sumihiro) 2013年2月27日@sumihiro マージ以外は別スレッドに回せると思いますよー
— Yuichi Fujishigeさん (@nakiwo) 2013年2月27日@nakiwo なるほどー。ありがとうございますー。
— Sumihiro Ueda/上田澄博 ✅さん (@sumihiro) 2013年2月27日Sleipnir for Mac のブックマークや履歴は Core Data で管理してます。プログラマはみんな NSManagedObject と仲良し。
— フェンリル | Mac+iOSさん (@fenrir_iphone) 2013年2月27日Core Data はスレッド/キューごとに NSManagedObjectContext を作る必要があり、当然そこに含まれる NSManagedObject もスレッド間でやりとりできないのでバックグラウンド化はけっこうややこしかったりします。
— フェンリル | Mac+iOSさん (@fenrir_iphone) 2013年2月27日見落としがちなのは、NSManagedObjectContext は alloc-init されたスレッドを覚えていて、そのスレッドでしか呼び出してはいけないという点。1つのスレッドでしか使ってなくても別スレッド生まれの Context は謎のクラッシュを起こす可能性も。
— フェンリル | Mac+iOSさん (@fenrir_iphone) 2013年2月27日Core Data のバックグラウンド処理関連は iOS 5 / Lion で使いやすく改善されてます。ただ Sleipnir では iOS 4 も Snow Leopard もサポートしているのでそのあたりは使ってません。Snow Leopard はいい OS です。
— フェンリル | Mac+iOSさん (@fenrir_iphone) 2013年2月27日@sumihiro OS5以上ならinitWithConcurrencyType+performBlock でだいぶましになります
— Yuichi Fujishigeさん (@nakiwo) 2013年2月27日僕もperformBlock使っていこう。