对 fetchResultController 如何与 MagicalRecord 一起工作感到困惑
Posted
技术标签:
【中文标题】对 fetchResultController 如何与 MagicalRecord 一起工作感到困惑【英文标题】:Confused about how fetchResultController works with MagicalRecord 【发布时间】:2011-09-29 06:29:19 【问题描述】:我有一个 NSOperation 子类,这是主要方法:
(void)main
NSAutoreleasePool *Pool = [[NSAutoreleasePool alloc] init];
managedObjectContext = [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread];
Message *message = (Message *) [managedObjectContext objectWithID:self.messageID];
message.status = [NSNumber numberWithInt:SKMessageSendStateStart];
[message save];
[self send];
[self finish];
[Pool drain];
我这样定义 fetchResultController 和 defaultContext:
(BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
[MagicalRecordHelpers setupCoreDataStackWithStoreNamed:@"Shark"];
self.context = [NSManagedObjectContext context];
[NSManagedObjectContext setDefaultContext:self.context];
self.fetchController = [Message fetchRequestAllGroupedBy:nil withPredicate:nil sortedBy:@"text" ascending:YES];
[self.fetchController setDelegate:self];
[self.fetchController performFetch:nil];
每次我调用 [message save] 时,控制台注销: -NSManagedObjectContext(MagicalRecord) mergeChangesFromNotification:合并更改到 * DEFAULT 主线程上的上下文 *
但是 NSFetchedResultsControllerDelegate 永远不会被调用! 这是否意味着我将 FetchedResultsController 设置错了?一世 我完全糊涂了。
提前致谢。
【问题讨论】:
为什么要使用多个托管对象上下文? 在多个线程上使用核心数据需要多个托管对象上下文。 developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 【参考方案1】:这不起作用的原因是 MagicalRecord 会自动为您调用 performFetch:,因此不允许您提前设置委托。
另外,在你的 applicationDidFinishLaunching: 方法中,你想删除这些行:
self.context = [NSManagedObjectContext context];
[NSManagedObjectContext setDefaultContext:self.context];
在这种情况下,您不想更改默认上下文。当您调用 setupCoreDataStackWithStoreNamed 时,MagicalRecord 正在为您处理事情:...也就是说,当该方法完成时,MOC 已经可供使用,无需折腾它为您创建的 MOC 并将默认上下文设置为新实例在这种特殊情况下。
如果您要做的只是将上下文传递给 MagicalRecord 提供的获取方法之一,则也没有必要保留上下文。 MagicalRecord 将创建一个单独的上下文供其使用(“默认”上下文)并使用它...
【讨论】:
【参考方案2】:我误解了 [NSManagedObjectContext 上下文] 的含义。它在主线程中创建一个新的上下文。由于 fetchResultController 监视器的上下文与更改合并到的上下文不同,因此不会调用 NSFetchedResultsControllerDelegate。
将 [NSManagedObjectContext context] 更改为 [NSManagedObjectContext defaultContext] 解决了问题。
【讨论】:
太棒了。您想将自己的回答标记为正确答案吗?以上是关于对 fetchResultController 如何与 MagicalRecord 一起工作感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
fetchResultController 快速获取 NSInvalidArgumentException
有时无法访问从 fetchResultController 返回的 NSmanagedObject
TableView NSFetchedResultsController CoreData:错误