gpt4 book ai didi

ios - 如何通知主MOC,后台MOC变化

转载 作者:行者123 更新时间:2023-11-29 02:19:35 24 4
gpt4 key购买 nike

我正在使用线程处理 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];
}
}

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

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

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

请帮忙

问候兰 git

最佳答案

如果您的应用程序在托管对象上下文发生更改时停止,我猜那是因为您的两个托管对象上下文相互观察(通过监听 NSManagedObjectContextDidSaveNotification),因此当发生更改时,就会形成一个无穷无尽的递归调用。

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

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

并触发变化,看看这一行是否输入了很多次。如果是,那么我的猜测是正确的。

编辑:

通过聊天,我得到了更多信息,问题是因为 PO 使用 GAI(Google Analytics SDK for iOS)GAI 使用核心数据进行数据持久化和 < strong>GAI 有自己的核心数据栈,当 GAI 保存它的上下文时,它会发送 NSManagedObjectContextDidSaveNotification,这个通知会全局,触发- mergeChanges:,在-mergeChanges:中,app会尝试合并GAI的context和app的context,这两个context使用不同的persistent store coordinator,这会导致问题。

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

关于ios - 如何通知主MOC,后台MOC变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28321218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com