首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通知主MOC,背景MOC的变化

如何通知主MOC,背景MOC的变化
EN

Stack Overflow用户
提问于 2015-02-04 12:19:27
回答 1查看 218关注 0票数 0

我正在使用线程处理coreData中的并发性,我遵循了苹果的示例示例,链接在这里-- https://developer.apple.com/library/ios/samplecode/ThreadedCoreData/Introduction/Intro.html --我对这个示例项目没有什么疑问。

我使用的是一个名为PullOperation的类,它是subClass of NSOperation,所以当拉发生时,

我想将更改通知我的主MOC,以便更新并显示在tableView上。

我想知道怎么做?

通过遵循示例应用程序,我在appDelate.m中编写了以下代码

代码语言:javascript
复制
  - (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];
        }
    }

这里我们可以看到合并变更的通知。

但是我的应用程序被卡住了,没有响应,我收到消息说,由于内存问题,应用程序停止了。

所以我想知道我哪里出了问题。

请帮帮忙

问候兰吉特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-04 14:23:00

如果您的应用程序在发生托管对象上下文更改时停止,我猜这是因为您的托管对象上下文相互观察(通过侦听NSManagedObjectContextDidSaveNotification),因此当发生更改时,它将形成一个没完没了的递归调用。

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

代码语言:javascript
复制
[self performSelectorOnMainThread:@selector(updateMainContext:) withObject:notification waitUntilDone:NO];

并触发一个更改,以查看是否多次输入此行。如果是,那么我的猜测是正确的。

编辑:

通过聊天,我得到了更多的信息,问题是PO正在使用GAI(Google Analytics SDK for iOS)GAI使用核心数据进行数据持久性,GAI有自己的核心数据堆栈,当GAI保存其上下文时,它将发布NSManagedObjectContextDidSaveNotification,并且这个通知进入全局,触发-mergeChanges:,在-mergeChanges:中,app将尝试将GAI's context与应用程序的上下文合并,E 114这两个上下文使用不同的持久性存储协调器E 215,这导致了问题。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28321218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档