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也许我可以在解析服务响应时逐个更新对象,尽管这听起来性能更差。。。我发布了另一个关于这个问题的问题:它应该是对象上的某个标识符。然后,您可以仅获取具有此标识符的对象,并更新、删除或(如果没有任何-创建)。