如何通知主MOC,后台MOC变化
How to notify main MOC, changes in background MOC
我正在使用线程在 coreData 中处理并发,我遵循了 apple 的示例,link 在这里 https://developer.apple.com/library/ios/samplecode/ThreadedCoreData/Introduction/Intro.html
我对这个示例项目没有什么疑问
我正在使用 class 调用 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];
}
}
这里可以看到有合并变更的通知
但是我的应用程序卡住了,没有响应,我收到消息说应用程序因内存问题而停止。
所以我想知道我哪里出错了。
请帮忙
问候
兰吉特
如果您的应用程序在托管对象上下文发生更改时停止,我想那是因为您的两个托管对象上下文相互观察(通过监听 NSManagedObjectContextDidSaveNotification
),因此当发生更改时,就会形成无穷无尽的递归调用。
但是我没有足够的代码,所以我只是猜测,我建议你在这一行打一个断点:
[self performSelectorOnMainThread:@selector(updateMainContext:) withObject:notification waitUntilDone:NO];
并触发变化,看看这一行是不是输入了很多很多次。如果是,那我猜对了。
编辑:
通过聊天,我得到了更多信息,问题是因为PO正在使用GAI(Google Analytics SDK for iOS)
,GAI
使用核心数据进行数据持久化,而GAI有自己的核心数据堆栈,当 GAI 保存其上下文时,它将 post NSManagedObjectContextDidSaveNotification
,并且此通知 全局 ,触发 -mergeChanges:
,在 -mergeChanges:
,应用程序将尝试将 GAI's context
与应用程序的上下文合并,这两个上下文使用不同的持久存储协调器,这会导致问题。
为了解决这个问题,我们需要检查源上下文是否使用与目标上下文相同的协调器,如果不是,则不合并。
我正在使用线程在 coreData 中处理并发,我遵循了 apple 的示例,link 在这里 https://developer.apple.com/library/ios/samplecode/ThreadedCoreData/Introduction/Intro.html 我对这个示例项目没有什么疑问
我正在使用 class 调用 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];
}
}
这里可以看到有合并变更的通知
但是我的应用程序卡住了,没有响应,我收到消息说应用程序因内存问题而停止。
所以我想知道我哪里出错了。
请帮忙
问候 兰吉特
如果您的应用程序在托管对象上下文发生更改时停止,我想那是因为您的两个托管对象上下文相互观察(通过监听 NSManagedObjectContextDidSaveNotification
),因此当发生更改时,就会形成无穷无尽的递归调用。
但是我没有足够的代码,所以我只是猜测,我建议你在这一行打一个断点:
[self performSelectorOnMainThread:@selector(updateMainContext:) withObject:notification waitUntilDone:NO];
并触发变化,看看这一行是不是输入了很多很多次。如果是,那我猜对了。
编辑:
通过聊天,我得到了更多信息,问题是因为PO正在使用GAI(Google Analytics SDK for iOS)
,GAI
使用核心数据进行数据持久化,而GAI有自己的核心数据堆栈,当 GAI 保存其上下文时,它将 post NSManagedObjectContextDidSaveNotification
,并且此通知 全局 ,触发 -mergeChanges:
,在 -mergeChanges:
,应用程序将尝试将 GAI's context
与应用程序的上下文合并,这两个上下文使用不同的持久存储协调器,这会导致问题。
为了解决这个问题,我们需要检查源上下文是否使用与目标上下文相同的协调器,如果不是,则不合并。