mergeChangesFromContextDidSaveNotification消耗内存

时间:2014-04-11 00:05:25

标签: ios core-data

我有两个NSManagedObjectContext,一个用于ui,另一个用于后台任务。每当后台更改时,我都会尝试将更改合并到UIcontext。但每当我打电话

mergeChangesFromContextDidSaveNotification:notification

它只是开始吃内存(在模拟器上将达到1GB)并导致崩溃。

当然我设置了一个通知:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(coreUpdateFromApp:)
                                                 name:NSManagedObjectContextDidSaveNotification
                                               object:nil];

并尝试在主线程等中进行合并。没有运气!

我发现URIRepresentation引起了这个问题。出于某种原因,它一直被召唤。 (通过苹果公司的代码不是我的)

请注意,我让它运行不到一秒,它使用64.95MB,它将使用相同的调用树快速增长。如果我继续运行它也会使osx崩溃!

Profiler result

2 个答案:

答案 0 :(得分:4)

问题是object:nil。你正在听到无尽的通知回声。

您需要指定一个特定的上下文对象来收听来自的通知。

答案 1 :(得分:0)

问题在于,由于Google Analytics也在使用核心数据,因此我们也会拦截Google Analytics引发的无休止通知。

将对象设置为非零值对我来说不起作用。找到另一种方式,它对我来说是神奇的。

在你的观察者里面我有选择器方法,如下所示

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(managedObjectContextDidSave(_:)), name: NSManagedObjectContextDidSaveNotification, object: nil)

func managedObjectContextDidSave(notification: NSNotification) {
    if notification.object?.persistentStoreCoordinator != self.persistentStoreCoordinator {
        return
    }
    //do remaining task here.
}