对fetchResultController如何与MagicalRecord一起工作感到困惑

时间:2011-09-29 06:29:19

标签: objective-c core-data magicalrecord

我有一个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错误或者是什么?一世 我很困惑。

提前致谢。

2 个答案:

答案 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]解决了问题。