Ios A增量存储上下文与MagicalRecord MR_contextForCurrentThread

Ios A增量存储上下文与MagicalRecord MR_contextForCurrentThread,ios,core-data,nsmanagedobjectcontext,magicalrecord,afincrementalstore,Ios,Core Data,Nsmanagedobjectcontext,Magicalrecord,Afincrementalstore,我正在尝试将增量存储与MagicalRecord一起使用 我有一个几乎没有属性的类Beer(来自brewerydbweb服务)。要获取啤酒,我使用[Beer MR_fetchAllWithDelegate:self],它返回NSFetchedResultsController实例(我获取并分配给beerFetchController),并使用该控制器执行实际获取。正如您还可以看到的,我将视图控制器设置为该方法的委托,该方法依次将该视图控制器设置为beerFetchController的委托。到现

我正在尝试将增量存储与MagicalRecord一起使用

我有一个几乎没有属性的类Beer(来自brewerydbweb服务)。要获取啤酒,我使用[Beer MR_fetchAllWithDelegate:self],它返回NSFetchedResultsController实例(我获取并分配给beerFetchController),并使用该控制器执行实际获取。正如您还可以看到的,我将视图控制器设置为该方法的委托,该方法依次将该视图控制器设置为beerFetchController的委托。到现在为止,一直都还不错。我有一个显示啤酒的表视图,我实现了这个方法

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.beersTable reloadData];
}
因此,每当AFIncrementalStore获取数据并将其放入上下文时,就会通知控制器,然后调用此方法,并刷新表。问题是,根本不调用此委托方法!经过一些调查,我得出了一些结论

+ (NSFetchedResultsController *) MR_fetchAllWithDelegate:(id<NSFetchedResultsControllerDelegate>)delegate;
{
    return [self MR_fetchAllWithDelegate:delegate inContext:[NSManagedObjectContext MR_contextForCurrentThread]];
}


+ (NSFetchedResultsController *) MR_fetchAllWithDelegate:(id<NSFetchedResultsControllerDelegate>)delegate inContext:(NSManagedObjectContext *)context;
{
    NSFetchRequest *request = [self MR_requestAllInContext:context];
    NSFetchedResultsController *controller = [self MR_fetchController:request delegate:delegate useFileCache:NO groupedBy:nil inContext:context];

    [self MR_performFetch:controller];
    return controller;
}

您正在调用哪个线程
MR_fetchAllWithDelegate
on?如果它是主线程,它应该使用defaultContext,你应该可以。它是主线程,我从控制器上的viewDidLoad调用它。我只是不想修改魔法记录的内部结构,我不知道会有什么副作用,特别是我可能会忘记我很快就以某种方式修改了它。如果我将其保留为这样,经过修改后,我只能从主线程使用该方法。您将MR_defaultContext设置为什么?听起来您需要使用
MR_observeContext
设置从父上下文到子上下文的合并操作。我想知道MR_defaultContext最初是如何配置的,因为在主线程上运行时,
MR_contextForCurrentThread
返回
MR_defaultContext
。添加了该contextForCurrentThread。
+ (NSFetchedResultsController *) MR_fetchAllWithDelegate:(id<NSFetchedResultsControllerDelegate>)delegate inContext:(NSManagedObjectContext *)context;
{
    NSFetchRequest *request = [self MR_requestAllInContext:context];
    NSFetchedResultsController *controller = [self MR_fetchController:request delegate:delegate useFileCache:NO groupedBy:nil inContext:context.parentContext];

    [self MR_performFetch:controller];
    return controller;
}
+ (NSManagedObjectContext *) MR_contextForCurrentThread;
{
    if ([NSThread isMainThread])
    {
        return [self MR_defaultContext];
    }
    else
    {
        NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
        NSManagedObjectContext *threadContext = [threadDict objectForKey:kMagicalRecordManagedObjectContextKey];
        if (threadContext == nil)
        {
            threadContext = [self MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
            [threadDict setObject:threadContext forKey:kMagicalRecordManagedObjectContextKey];
        }
        return threadContext;
    }
}