3

在我的应用程序中,我尝试同时使用 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 和多线程环境有问题。有没有人尝试将所有这三个工具连接起来一起工作?如果是这样,我错过了什么?对于该架构,您是否有任何运行良好的代码示例?

4

1 回答 1

2

我建议使用:

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

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

我强烈建议您阅读这篇博文(由 MagicalRecord Saul Mora 的创建者撰写):轻松导入数据。它是关于 MagicalRecord 工作原理的超级好的背景信息以及如何使用它的示例。

如果您正确设置了数据模型,您实际上可以让 MagicalRecord 为您完成所有映射,您所要做的就是importFromObject:saveWithBlock:块内调用,您不必担心处理映射。我在上面链接的文章详细介绍了如何正确执行此操作,但这需要一些练习。

于 2013-01-30T02:57:24.607 回答