私は現在、別の開発者が開発した (非常に) 大きなアプリケーションを使用しています。
それはよく開発されており、コードはかなりよく見えます...コアデータへのアクセスの代わりに。
実際、への各アクセスManagedObjectContexts
は、いくつかの Web サービスに対応するいくつかのブロックで行われます... 複数のスレッドで。
ドキュメントには、それは悪いと書かれています。そのため、Core Data アクセスでアプリがフリーズすることがあります。
はい、そうすべきだとわかっています
スレッドごとに個別の管理対象オブジェクト コンテキストを作成し、単一の永続ストア コーディネーターを共有する
ドキュメントが言うように、しかしコードはすでに存在し、それは非常に巨大であり、私のクライアントは(いつものように)すぐに解決策を必要としています.
だからここに質問があります:
方法を見てきました[managedObjectContext lock]
。セマフォのようです。しかし、ドキュメントはあまり話していません。
異なるスレッドの私の Web サービスは、managedObjectContext の同じインスタンスを使用しています。
――やってみたらどう思いますか
[managedObjectContext lock]
// core data access
// core data access
// core data access
[managedObjectContext unlock]
私のWebサービスブロックのそれぞれで?
-これでフリーズは解決しますか?
――おすすめの方法は?
lock
&unlock
メソッドについて誰も教えてくれなかったので、EDIT を作成しました。
デフリーズは毎回発生するわけではないので、3つのケースを試しました:
データ アクセスを保護しない
[managedObjectContext lock]
unlock]
メソッドを使用する使用する
@synchronized(managedObjectContext) { ... }
最初のケースでは、10 回のテストで 3 回フリーズが発生しました。2 番目と 3 番目のケースでは、まったくフリーズしません。
だから私の2番目の質問:
lock
/unlock
との違いは何@synchronize( )
ですか?