如何比较不同上下文中的托管对象?

时间:2015-09-27 06:50:48

标签: ios multithreading core-data concurrency nsmanagedobjectcontext

我有一个类,我在数组中引用了一组NSManagedObject。这样的托管对象属于我称之为mainContext的托管对象,它与主线程相关联。

为了更新这些对象,我调用了几个Web服务,并使用从中获取的信息创建新的托管对象。我将这些新对象插入到我调用privateContext的上下文中,该上下文与私有队列相关联。此上下文具有自己独立的Core Data堆栈,它不是mainContext的子项。我这样做是为了避免在执行更新时阻塞主线程。

在我在mainContextself.entities)中拥有托管对象数组的同一个类中,我有另一个数组来保存privateContext中托管对象的引用( self.tempEntities)。我的目的是比较两个数组中的托管对象,并对mainContext中的对象进行更改:

- (void)manageEntitiesUpdate
{
   if ((self.tempEntities != nil) && (self.entities != nil)) {
       if (self.tempEntities.count > 0) {

           NSMutableArray *toDelete = [[NSMutableArray alloc] init];
           NSMutableArray *toModify = [[NSMutableArray alloc] init];

           for (MyEntity *tempEntity in self.tempEntities) {

               if (![tempEntity.isValid boolValue]) {
                   [toDelete addObject:tempEntity.idEntity];
               }

               for (MyEntity *entity in self.entities) {
                   if ([tempEntity.idEntity integerValue] == [entity.idEntity integerValue]) {
                       [toModify addObject:tempEntity.idEntity];
                       break;
                   }
               }
           }

           if (toDelete.count > 0) {
               // Get main context
               NSManagedObjectContext *mainContext = [CoreDataStack getMainContext];

               if (mainContext != nil) {
                   for (NSNumber *idEntity in toDelete) {

                       // Delete from main context
                       for (MyEntity *entity in self.entities) {
                           if ([idEntity integerValue] == [entity.idEntity integerValue]) {
                               [mainContext deleteObject:entity];
                               break;
                            }
                       }

                       // Delete from private context
                       for (MyEntity *entity in self.tempEntities) {
                           if ([idEntity integerValue] == [entity.idEntity integerValue]) {
                               [self.privateContext deleteObject:entity];
                               break;
                            }
                       }
                   }
               }
           }

           if (toModify.count > 0) {
               // Get main context
               NSManagedObjectContext *mainContext = [CoreDataStack getMainContext];

               if (mainContext != nil) {
                   for (NSNumber *idEntity in toModify) {

                    // Delete from main context
                    for (MyEntity *entity in self.entities) {
                        if ([idEntity integerValue] == [entity.idEntity integerValue]) {
                               [mainContext deleteObject:entity];
                               break;
                           }
                       }
                   }
               }
           }

           [self saveContext:self.privateContext];
           [self clearContext:self.privateContext];
       }
   }
}

在此方法之后,我在mainContext中重新获取数据。我运行应用程序,这似乎工作,但......它实际上是“合法的”我正在做什么?我可以在运行应用程序时遇到错误和崩溃吗?

如果是这样,我做错了,我怎么能管理这种情况?我调用更新的服务是异步的,我需要等待他们的响应然后用我得到的信息创建新对象。然后与我已经拥有的对象进行比较。我无法直接对已有的对象执行更新。

由于

0 个答案:

没有答案