我正在使用线程处理coreData中的并发性,我遵循了苹果的示例示例,链接在这里-- https://developer.apple.com/library/ios/samplecode/ThreadedCoreData/Introduction/Intro.html --我对这个示例项目没有什么疑问。
我使用的是一个名为PullOperation的类,它是subClass of NSOperation,所以当拉发生时,
我想将更改通知我的主MOC,以便更新并显示在tableView上。
我想知道怎么做?
通过遵循示例应用程序,我在appDelate.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];
}
}这里我们可以看到合并变更的通知。
但是我的应用程序被卡住了,没有响应,我收到消息说,由于内存问题,应用程序停止了。
所以我想知道我哪里出了问题。
请帮帮忙
问候兰吉特
发布于 2015-02-04 14:23:00
如果您的应用程序在发生托管对象上下文更改时停止,我猜这是因为您的托管对象上下文相互观察(通过侦听NSManagedObjectContextDidSaveNotification),因此当发生更改时,它将形成一个没完没了的递归调用。
但是我没有足够的代码,所以我猜,我建议你在这一行放一个断点:
[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,这导致了问题。
要解决这个问题,我们需要检查源上下文是否与目标上下文使用相同的协调器,如果没有,则不进行合并。
https://stackoverflow.com/questions/28321218
复制相似问题