如何通知主要MOC,后台MOC的变化

时间:2015-02-04 12:19:27

标签: ios multithreading core-data

我正在使用线程在coreData中使用并发,我按照apple的示例示例,链接在这里https://developer.apple.com/library/ios/samplecode/ThreadedCoreData/Introduction/Intro.html  我对这个示例项目几乎没有疑问

我正在使用类调用PullOperation,它是NSOperation的子类,所以当拉动时,

我想通知我的主要MOC,有关更改,以便更新并显示在tableView上

我想知道怎么做?

通过关注示例应用程序,我在appdelegate.m

中编写了此代码
  - (NSManagedObjectContext *)managedObjectContext {

        if (_managedObjectContext != nil) {
            return _managedObjectContext;
        }

        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (coordinator != nil) {
            _managedObjectContext = [NSManagedObjectContext new];
            [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        }

        // observe the ParseOperation's save operation with its managed object context
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(mergeChanges:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:nil];

        return _managedObjectContext;
    }

    // merge changes to main context,fetchedRequestController will automatically monitor the changes and update tableview.
    - (void)updateMainContext:(NSNotification *)notification {

        assert([NSThread isMainThread]);
        [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
    }

    // this is called via observing "NSManagedObjectContextDidSaveNotification" from our APLParseOperation
    - (void)mergeChanges:(NSNotification *)notification {

        if (notification.object != self.managedObjectContext) {
            [self performSelectorOnMainThread:@selector(updateMainContext:) withObject:notification waitUntilDone:NO];
        }
    }

在这里,我们可以看到有合并更改的通知。

但是我的应用程序卡住而且没有响应,我收到消息说app因内存问题而停止。

所以我想知道我哪里出错了。

请帮忙

此致 兰吉特

1 个答案:

答案 0 :(得分:1)

如果您的应用程序在托管对象上下文更改时暂停,我想这是因为您的托管对象上下文彼此观察(通过监听NSManagedObjectContextDidSaveNotification),因此当有更改时,它将形成一个无休止的递归呼叫。

但我没有足够的代码,所以我只是在猜测,我建议你在这一行设置一个断点:

[self performSelectorOnMainThread:@selector(updateMainContext:) withObject:notification waitUntilDone:NO];

并触发更改以查看此行是否多次输入。如果是,那我猜是对的。

修改

通过聊天,我获得了更多信息,而问题是因为PO正在使用GAI(Google Analytics SDK for iOS)GAI使用核心数据进行数据持久性而 GAI拥有自己的核心数据堆 ,当GAI保存其上下文时,它会发布NSManagedObjectContextDidSaveNotification,此通知将全局,触发-mergeChanges:,在-mergeChanges:中,应用会尝试合并{{ 1}}使用应用程序的上下文,这两个上下文使用不同的持久性存储协调器,这会导致问题。

要解决这个问题,我们需要检查源上下文是否使用与目标上下文相同的协调器,如果没有,则不需要合并。