cocoa-touch - NSManagedObjectContextDidSaveNotification 在 iOS 7 中未触发

标签 cocoa-touch cocoa core-data nsmanagedobject nsmanagedobjectcontext

我遇到了一种情况,我在主线程中对 NSManagedObject 的属性进行了一些更改。它属于应用程序的主 ManagedObjectContext。

我的应用程序确实启用了下载数据的线程,每个线程都有自己的 ManagedObjectContext,该上下文是根据整个应用程序中单个 PersistentStore 的最新状态创建的。

我正在实现 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 的任何属性并仅对其 MOC 执行 -save 操作时,会触发通知

相同的代码在 iOS 6 中运行得很好。无论是否对 ManagedObject 进行任何更改,当在其 MOC 上触发 -save 调用时,通知 NSManagedObjectContextDidSaveNotification 被触发。

以前有人遇到过这个问题吗?

最佳答案

目前我注意到一件事出了问题,但我不确定它是否导致了您的错误。 NSManagedObjectContextDidSaveNotification 在调用 save 的 MOC 正在运行的线程上发送。但合并应该在 MOC 合并更改正在运行的线程上进行。在您的情况下,如果更改从后台合并到主 MOC,则效果很好,但反之则不然。

关于cocoa-touch - NSManagedObjectContextDidSaveNotification 在 iOS 7 中未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19219340/

相关文章:

swift - 正在获取 dyld : Library not loaded: @rpath/Alamofire. framework/Alamofire,原因:找不到图像

cocoa - NSTextField 文本和背景颜色(带/不带焦点)

objective-c - 如何使用 Xcode 4 绑定(bind)到 Cocoa 中的自定义 View ?

objective-c - Core Data (Mac) 如何在 ID 字段上实现自增

iphone - 释放 CGContextDrawPDFPage 使用的内存

ios - UITextField 的 UIToolbar 附件 View 无响应

swift - 如何重用 UIViewRepresentable UIKit 组件?

objective-c - 从 Cocoa 应用程序创建 ZIP 存档

iphone - 核心数据 - 基本问题

ios - MOGenerator 和 NSOrderedSet