Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在不同的上下文中比较托管对象?_Ios_Multithreading_Core Data_Concurrency_Nsmanagedobjectcontext - Fatal编程技术网

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

Ios 如何在不同的上下文中比较托管对象?,ios,multithreading,core-data,concurrency,nsmanagedobjectcontext,Ios,Multithreading,Core Data,Concurrency,Nsmanagedobjectcontext,我有一个类,在该类中,我在数组中保留对一组NSManagedObject的引用。这些托管对象属于我称之为我的mainContext,它与主线程关联 为了更新这样的对象,我调用了几个web服务,并使用从中获得的信息创建了新的托管对象。我将这些新对象插入到我调用的与私有队列关联的上下文中。此上下文有自己独立的核心数据堆栈,它不是mainContext的子级。我这样做是为了避免在执行更新时阻塞主线程 在mainContext(self.entities)中有托管对象数组的同一个类中,我有另一个数组来保

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

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

mainContext
self.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
中重新提取数据。我运行了这个应用程序,这似乎是可行的,但。。。我所做的事真的“合法”吗?在运行应用程序的其他时间,是否会出现错误和崩溃

如果是这样的话,我做错了,我该如何应对这种情况?我调用的更新服务是异步的,我需要等待它们的响应,然后使用我获得的信息创建新对象。然后与我已经拥有的物品进行比较。我无法直接对已有的对象执行更新


谢谢

为什么不更新现有对象而不创建新对象?@kirander因为服务只给我需要更新的对象。我的意思是:如果我收到一个标记为“isValid”设置为false的特定对象,这意味着我必须删除我拥有的相应对象。对于我从服务接收到的其他对象,如果它们已经存在于应用程序中,我需要用新的属性更新它们的属性,如果它们还没有存在,我需要插入它们。因此,我需要获得服务的完整响应,以便知道我必须应用哪些更改。@kirander也许我可以在解析服务响应时逐个更新对象,尽管这听起来性能更差。。。我发布了另一个关于这个问题的问题:它应该是对象上的某个标识符。然后,您可以仅获取具有此标识符的对象,并更新、删除或(如果没有任何-创建)。