私は長い間この問題の解決策を探していましたが、まだ解決していません。
コアデータを使用して iOS アプリを開発しています。同じ永続ストア コーディネーターを指す 2 つの管理対象オブジェクト コンテキスト (MOC) を作成しました。1 つの MOC (self.moc と呼ばれる) はメイン キューの同時実行で開始され、もう 1 つの mov (self.bmoc と呼ばれる) はプライベート キューの同時実行で開始されます。self.moc がメイン スレッドでのみ実行され、self.bmoc がそのperformBlock
またはperformBlockAndWait
ブロック内でのみ実行されることを確認しました。
ただし、アプリが[self.bmoc save:nil]
回線上でフリーズするという奇妙な状況に遭遇しました。保存アクションはperformBlock
ブロック内で実行されるため、デッドロックに達する理由がわかりません。[self.bmoc save:&error]
その行でフリーズするので、ではなく使ってもエラーは出ませんnil
。
以下は、問題を再現するコードです。以下に似た機能がたくさんありますが、これだけが問題を引き起こします。問題の原因を突き止めることができず、洞察をいただければ幸いです。ありがとうございました!
-(void)createEmptyUserData {
[self.bmoc performBlock:^{
User* user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.bmoc];
/* sets user object */
[self.bmoc save:nil];
}];
}
注: このコードはメイン スレッドで実行されます。