2016-12-27 39 views
1

由于同步操作的一部分,我抢了很多使用NSSession对象API数据所推荐的this answerIOS: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完全加载之前以及作为故障排除的一部分之前,存在很长的延迟 - 我想这可能是问题所在。

谢谢你的建议。

回答

0

你不应该在主线程中这样做。但是,您应该如何实现它取决于您的Core Data堆栈以及您在processData函数中实际执行的操作。通常,在这些导入场景中,最好的做法是从专用队列上的子上下文执行保存操作。

苹果有一些示例代码here。从该网页

摘录:

在这个例子中数据的阵列已被最初接收作为JSON有效载荷。然后创建一个新的NSManagedObjectContext,它被定义为一个私有队列。新的上下文被设置为运行应用程序的主队列上下文的子元素。从那里调用performBlock:并在传递给performBlock的块内部执行实际的NSManagedObject创建:一旦所有数据都被消耗并转换为NSManagedObject实例,就可以在私有上下文中调用save,将所有更改移至主队列上下文中,而不会阻塞主队列。

+0

好的。听起来像一只熊。我做了大量的处理,看起来像我将不得不花费大量的时间来整理哪些MOC正在使用。 – Arjun

+0

要确认,processData应该在上面显示的位置? – Arjun

+0

对,与许多MOC一起工作可能会很痛苦。但搞清楚哪一个被使用很容易,因为每个MO都有一个(弱)参考MOC。所以除非你和你的MOC交易过,否则你可以参考任何给定的MO的MOC。 –

相关问题