IOS:API调用后,可能会更新到核心数据在后台线程?
问题描述:
由于同步操作的一部分,我抢了很多使用NSSession对象API数据所推荐的this answer:IOS:API调用后,可能会更新到核心数据在后台线程?
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *data = [session dataTaskWithURL:dataUrl completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// use `Data` here
if (data !=nil) {
[self processData:data];//this currently includes saving to CoreData
}
// finally, any UI/model updates should happen on main queue
dispatch_async(dispatch_get_main_queue(), ^{
//do what you want with data
NSLog(@"back in main queue");
if (data==nil) {
NSLog(@"no data from api");
}
else {
[self.tableView setNeedsDisplay];
[self.tableView reloadData];
}
});
}];
[data resume];
我的问题是,是没关系的数据CoreData保存在后台线程,还是在完成块/主线程中做得更好?现在我正在后台线程中执行它。然而,在tableview完全加载之前以及作为故障排除的一部分之前,存在很长的延迟 - 我想这可能是问题所在。
谢谢你的建议。
答
你不应该在主线程中这样做。但是,您应该如何实现它取决于您的Core Data堆栈以及您在processData函数中实际执行的操作。通常,在这些导入场景中,最好的做法是从专用队列上的子上下文执行保存操作。
苹果有一些示例代码here。从该网页
摘录:
在这个例子中数据的阵列已被最初接收作为JSON有效载荷。然后创建一个新的NSManagedObjectContext,它被定义为一个私有队列。新的上下文被设置为运行应用程序的主队列上下文的子元素。从那里调用performBlock:并在传递给performBlock的块内部执行实际的NSManagedObject创建:一旦所有数据都被消耗并转换为NSManagedObject实例,就可以在私有上下文中调用save,将所有更改移至主队列上下文中,而不会阻塞主队列。
好的。听起来像一只熊。我做了大量的处理,看起来像我将不得不花费大量的时间来整理哪些MOC正在使用。 – Arjun
要确认,processData应该在上面显示的位置? – Arjun
对,与许多MOC一起工作可能会很痛苦。但搞清楚哪一个被使用很容易,因为每个MO都有一个(弱)参考MOC。所以除非你和你的MOC交易过,否则你可以参考任何给定的MO的MOC。 –