我正在使用 AFNetworking 和 MagicalRecord (当前的开发分支),我试图弄清楚如何导入大量相互依赖的对象。每个资源/实体都有多个值得下载的页面。我有一个类管理给定实体的下载并使用 MagicalDataImport 保存它们(这太棒了)。
我相信我的问题是导入没有发生在同一个线程上。所以我认为正在发生的事情是:
- 在一个线程中,EntityA 被正确保存并传播到父实体。
- 然后在另一个线程中,EntityB 被保存,并与它一起建立了与 EntityA 的关系。这意味着正在创建一个空白(故障?)对象。然后,当它传播到父实体时,我相信 EntityA 正在覆盖那里的 EntityA。因此,我留下了一些不具备所有属性的对象。
至少,我认为这就是正在发生的事情。我通过 UI 看到的实际上是实体之间的关系并不总是正确构建。
我的最终目标是让整个下载/导入过程在后台完成,根本不影响 UI。
这是我的 AFJSONRequest:
AFJSONRequestOperation *operation = [AFJSONRequestOperation
JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
[self saveResources:[JSON objectForKey:@"data"]];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
{
DLog(@"%@",error.userInfo);
[self.webService command:self didFail:error.localizedDescription];
}];
[operation setQueuePriority:self.priority];
它调用saveResources:
:
- (void)saveResources:(NSArray*)resources {
BOOL stopDownloads = [self stopDownloadsBasedOnDate:resources];
if ([resources count] > 0 && !stopDownloads){
self.offset = @([offset intValue] + [resources count]);
[self send];
}
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *blockLocalContext) {
[self.classRef MR_importFromArray:resources inContext:blockLocalContext];
} completion:^(BOOL success, NSError *error) {
if (error){
// ... handle errors
}
else {
// ... handle callbacks
}
}];
}
这将启动另一个下载 ( [self send]
),然后保存对象。
我知道默认情况下 AFNetworking 调用主队列中的回调,并且我尝试将SuccessCallbackQueue
/设置FailureCallbackQueue
为我的后台线程,但这似乎并没有解决所有问题,我仍然有一些关系到故障对象,尽管我认为我确实需要这样做以使一切都在后台线程中进行。
为了将这些更改正确地传播到主上下文,我还需要调用其他什么吗?或者我需要以不同的方式进行设置,以确保正确保存所有对象并正确建立关系?
更新 我已经重写了这个问题,试图对这些问题进行更多的澄清。
更新
如果您需要更多代码,我创建了一个包含(我相信)所有内容的要点。