我有一个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错误或者是什么?一世 我很困惑。
提前致谢。
答案 0 :(得分:4)
这不起作用的原因是因为MagicalRecord将自动为您调用performFetch:因此不允许您提前设置委托。
此外,在您的applicationDidFinishLaunching:方法中,您要删除这些行:
self.context = [NSManagedObjectContext context];
[NSManagedObjectContext setDefaultContext:self.context];
在这种情况下,您不希望更改默认上下文。当你调用setupCoreDataStackWithStoreNamed时,MagicalRecord会为你处理东西:...也就是说,当该方法完成时,MOC已经可以使用了,没有必要为你创建一个MOC,并将默认上下文设置为新的实例在这种特殊情况下。
如果您正在使用它来传递给MagicalRecord提供的其中一种获取方法,那么也没有必要保持上下文。 MagicalRecord将为其使用创建一个上下文('默认'上下文),并使用它......
答案 1 :(得分:1)
我误解了[NSManagedObjectContext context]的含义。它在主线程中创建一个新的上下文。由于fetchResultController监视器的上下文与更改合并到的上下文不同,因此不会调用NSFetchedResultsControllerDelegate。
将[NSManagedObjectContext context]更改为[NSManagedObjectContext defaultContext]解决了问题。