我有一个类,我在数组中引用了一组NSManagedObject
。这样的托管对象属于我称之为mainContext
的托管对象,它与主线程相关联。
为了更新这些对象,我调用了几个Web服务,并使用从中获取的信息创建新的托管对象。我将这些新对象插入到我调用privateContext
的上下文中,该上下文与私有队列相关联。此上下文具有自己独立的Core Data堆栈,它不是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
中重新获取数据。我运行应用程序,这似乎工作,但......它实际上是“合法的”我正在做什么?我可以在运行应用程序时遇到错误和崩溃吗?
如果是这样,我做错了,我怎么能管理这种情况?我调用更新的服务是异步的,我需要等待他们的响应然后用我得到的信息创建新对象。然后与我已经拥有的对象进行比较。我无法直接对已有的对象执行更新。
由于