3

我有一个 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: Merging changes to * DEFAULT 语境在主线程上 *

但是 NSFetchedResultsControllerDelegate 永远不会被调用!这是否意味着我将 FetchedResultsController 设置错了?我完全糊涂了。

提前致谢。

4

2 回答 2

4

这不起作用的原因是 MagicalRecord 会自动为您调用 performFetch: ,因此不允许您提前设置委托。

此外,在您的 applicationDidFinishLaunching: 方法中,您要删除这些行:

self.context = [NSManagedObjectContext context];
[NSManagedObjectContext setDefaultContext:self.context];

在这种情况下,您不想更改默认上下文。当您调用 setupCoreDataStackWithStoreNamed 时,MagicalRecord 正在为您处理事情:...也就是说,当该方法完成时,MOC 已经可供使用,无需折腾它为您创建的 MOC 并将默认上下文设置为新实例在这种特殊情况下。

如果您要做的只是使用它传递给 MagicalRecord 提供的获取方法之一,则也没有必要保留上下文。MagicalRecord 将为其使用创建一个单一的上下文(“默认”上下文),然后使用它......

于 2011-10-26T04:17:03.973 回答
1

我误解了 [NSManagedObjectContext context] 的含义。它在主线程中创建一个新的上下文。由于 fetchResultController 监视器的上下文与更改合并到的上下文不同,因此不会调用 NSFetchedResultsControllerDelegate。

将 [NSManagedObjectContext context] 更改为 [NSManagedObjectContext defaultContext] 解决了问题。

于 2011-10-15T02:50:04.803 回答