メインスレッドで NSManagedObject のプロパティを変更する状況があります。アプリのメインの ManagedObjectContext に属します。
私のアプリでは、データをダウンロードするスレッドが有効になっています。各スレッドには、アプリケーション全体で単一の PersistentStore の最新の状態から作成された独自の ManagedObjectContext があります。
NSManagedObjectContextDidSaveNotification
MOC の変更がメイン スレッドの MOC にもマージされるように実装しています。以下はそのコードです。
- (void)backgroundMOCDidSave:(NSNotification*)notification
{
// Probable fix for: http://stackoverflow.com/questions/3446983/collection-was-mutated-while-being-enumerated-on-executefetchrequest
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(backgroundMOCDidSave:) withObject:notification waitUntilDone:YES];
return;
}
// We merge the background moc changes in the main moc
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
この通知への登録:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(backgroundMOCDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:nil];
しかし、iOS 7 では奇妙なことが起こります。メイン MOC から作成された NSManagedObject にアクセスしています。
- メイン MOC (メイン スレッド) に属する ManagedObject のプロパティを変更して実行すると
-save
、-backgroundMOCDidSave:
呼び出しがトリガーされない - ManagedObject のプロパティを変更せず、
-save
その MOC で操作を実行するだけで、通知がトリガーされます
iOS 6 でも同じコードが完全に機能しています。ManagedObject で変更が行われたかどうかに関係なく、-save
MOC で呼び出しがトリガーされると、通知NSManagedObjectContextDidSaveNotification
がトリガーされます。
以前にこの問題に直面した人はいますか?