ios – 多个NSManagedObjectContexts或单个上下文和-performBlock

前端之家收集整理的这篇文章主要介绍了ios – 多个NSManagedObjectContexts或单个上下文和-performBlock前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我长期以来一直使用Core Data与单个NSManagedObjectContext,所有获取,保存,后台更新操作都将通过助手类在单个上下文中完成,我计划实施多个NSManagedObjectContext方法(这是大多数推荐的解决方案我的搜索).

我的问题是:是performBlock,唯一的是为该上下文执行代码?我们不能做如下的事情:

  1. - (void) checkSyncServer {
  2. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),^{
  3. //do something here,check and fetch data
  4. // create NSManagedObject's
  5. [_tempContext save:&error];
  6. //masterContext will merge changes through notification observers
  7. });
  8. }

(即)执行除了-performBlock方法之外的代码.如何执行多个异步方法并执行保存?

但是,我发现一个单一的上下文(由一个单例NSObject类管理)更简单.

这种与ContextConcurrencyType的多个上下文看起来更复杂(就执行流程而言).有更好的解决方案吗?

解决方法

您可以通过以下两种方式之一访问上下文:

>在线程/队列.这适用于限制的上下文和主队列上下文.您可以从自己的线程自由访问它们.
>使用-performBlock:如果它是一个私有队列上下文,或者你是从一个线程而不是它所属的线程触摸上下文.

您不能使用dispatch_async访问上下文.如果您希望该操作是异步的,则需要使用-performBlock:.

如果您之前使用单个上下文,并且您正在使用dispatch_async触摸它,则会违反线程限制规则.

更新

当您调用功能上等同于[[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]的[[NSManagedObjectContext alloc] init]时.

NSManagedObjectContext一直被线程限制.

至于执行多个方法,你可以在同一个程序段中调用它们:

  1. NSManagedObjectContext *moc = ...;
  2. [moc performBlock:^{
  3. //Fetch something
  4. //Process data
  5. //Save
  6. }];

或者你可以嵌套它们,如果你希望他们彼此不同步:

  1. NSManagedObjectContext *moc = ...;
  2. [moc performBlock:^{
  3. //Fetch Something
  4. [moc performBlock:^{
  5. //Process Data
  6. }];
  7. [moc performBlock:^{
  8. //Save
  9. }];
  10. }];

由于–performBlock:进入安全的你可以嵌套他们所有你想要的.

更新异步保存

要做一个异步保存,你应该有两个上下文(或更多):

> UI会话的主队列上下文
>保存的私有队列上下文

私有上下文具有NSPersistentStoreCoordinator,主队列上下文的私有作为其父对象.

所有工作都在主队列上下文中完成,您可以安全地保存,通常在主线程上.那个保存将是瞬间的.之后,你做一个异步保存:

  1. NSManagedObjectContext *privateMOC = ...;
  2. NSManagedObjectContext *mainMOC = ...;
  3.  
  4. //Do something on the mainMOC
  5.  
  6. NSError *error = nil;
  7. if (![mainMOC save:&error]) {
  8. NSLog(@"Main MOC save Failed: %@\n%@",[error localizedDescription],[error userInfo]);
  9. abort();
  10. }
  11.  
  12. [privateMOC performBlock:^{
  13. NSError *error = nil;
  14. if (![privateMOC save:&error]) {
  15. NSLog(@"Private moc Failed to write to disk: %@\n%@",[error userInfo]);
  16. abort();
  17. }
  18. }];

如果你已经有一个应用程序,你需要做的就是:

>创建您的私人moc
>将其设置为主要的父级
>更改你的main的init
>当您在主电话上保存时,添加私有块保存方法

你可以从那里重构,但这是你真正需要改变的.

猜你在找的iOS相关文章