MagicalRecord + AFNetworking + NSFetchedResultsController,如何让它工作?

时间:2013-01-28 09:39:22

标签: ios core-data nsfetchedresultscontroller afnetworking magicalrecord

在我的应用程序中,我尝试将MagicalRecord + AFNetworking + NSFetchedResultsController一起使用,以同步数据并在地图或tableView中动态显示它。

让我们看一些下载方法的代码:

+ (void) getDataWithCompletionBlock: (void (^)(void)) block {

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URL_GET_DATA]];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
            for (NSDictionary *dict in JSON) {
                [MyModel createOrUpdateMyModelFromDict:[dict mutableCopy]];
            }

            [[NSManagedObjectContext MR_contextForCurrentThread] MR_saveInBackgroundCompletion:^{
                [[NSManagedObjectContext MR_contextForCurrentThread] MR_saveNestedContexts];

                block();
            }];
        });

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        DDLogError(@"getDataWithCompletionBlock FAILURE: %@", error);
    }];

    [operation start];
}

我使用AFJSONRequestOperation下载数据,然后使用GCD和后台线程创建模型,保存当前线程的上下文并执行successBlock(MagicalRecord在successBlock上运行dispatch_get_main_queue(),所以它在GUI线程中调用。

此同步模型可以吗?因为有时候(通常在真实设备而不是模拟器上)我从NSFetchedResultsController得到一些错误,例如“索引处没有对象:索引处的部分:”或“CoreData无法解决错误......”。

他们都暗示,Core Data和多线程环境存在问题。有没有人试图连接所有这三个工具一起工作?如果是这样,我错过了什么?您是否为该架构提供了任何良好的代码示例?

1 个答案:

答案 0 :(得分:2)

我建议使用:

[MagicalRecord saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block];

它为您处理线程,因此您不必担心从背景上下文中保存在父上下文中的任何内容。

我强烈建议您阅读此博客文章(由MagicalRecord Saul Mora的创作者撰写):IMPORTING DATA MADE EASY。它是关于MagicalRecord工作的超级好背景信息,以及如何使用它的例子。

如果您正确设置了数据模型,您实际上可以让MagicalRecord为您完成所有映射,您只需在importFromObject:块内调用saveWithBlock:即可,您无需担心关于处理映射。我上面链接的文章详细介绍了如何正确地完成它,但需要一些练习。