0

メインスレッドで NSManagedObject のプロパティを変更する状況があります。アプリのメインの ManagedObjectContext に属します。

私のアプリでは、データをダウンロードするスレッドが有効になっています。各スレッドには、アプリケーション全体で単一の PersistentStore の最新の状態から作成された独自の ManagedObjectContext があります。

NSManagedObjectContextDidSaveNotificationMOC の変更がメイン スレッドの 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 で変更が行われたかどうかに関係なく、-saveMOC で呼び出しがトリガーされると、通知NSManagedObjectContextDidSaveNotificationがトリガーされます。

以前にこの問題に直面した人はいますか?

4

1 に答える 1

1

今のところ、1 つの問題に気付きましたが、それがエラーの原因であるかどうかはわかりません。NSManagedObjectContextDidSaveNotification呼び出した MOCsaveが実行されているスレッドで送信されます。ただし、マージは MOC マージ変更が実行されているスレッドで行う必要があります。あなたの場合、変更がバックグラウンドからメインMOCにマージされた場合は正常に機能しますが、その逆は機能しません。

于 2013-10-07T09:07:18.000 に答える