这种问题有很多,但是我找不到关于CoreData的。问题是:我想更新大量的NSManagedObject(可以想象为重置大量NSManagedObject的属性)。目前,我能想到的只有:
1.获取所有对象。 2.使用forin-loop循环遍历所有对象。 3.在每个for块中设置属性。
数据可能很大,我还想为此操作编写一个实用程序。所以问题是:有没有更有效的方法来执行此操作?我不相信使用for-loop是高效的。
额外的问题是:我还想删除满足条件的所有对象(最可能是布尔标志)。我的解决方案与上面类似:
1.使用NSPredicate和条件获取所有对象。 2.使用forin循环遍历所有对象。 3.删除每个对象。
对于解决方案也是同样的问题。
真正的问题是什么?
实际问题是,我想将所有对象的标志(称其为willDelete)设置为YES。然后从服务器同步,然后更新它们并将willDelete设置为NO。之后,任何willDelete为YES的对象都将从上下文中删除。
编辑1:
我的问题可能与this one不同。我想先更新属性。我关心的是性能时间,而不是内存。
编辑2:
好的,我设法使用了NSBatchUpdateRequest。但问题是:我得到了nsmergeConflict。不确定如何处理这个进程。无论如何,这是代码:
这将把所有的
1.获取所有对象。 2.使用forin-loop循环遍历所有对象。 3.在每个for块中设置属性。
数据可能很大,我还想为此操作编写一个实用程序。所以问题是:有没有更有效的方法来执行此操作?我不相信使用for-loop是高效的。
额外的问题是:我还想删除满足条件的所有对象(最可能是布尔标志)。我的解决方案与上面类似:
1.使用NSPredicate和条件获取所有对象。 2.使用forin循环遍历所有对象。 3.删除每个对象。
对于解决方案也是同样的问题。
真正的问题是什么?
实际问题是,我想将所有对象的标志(称其为willDelete)设置为YES。然后从服务器同步,然后更新它们并将willDelete设置为NO。之后,任何willDelete为YES的对象都将从上下文中删除。
编辑1:
我的问题可能与this one不同。我想先更新属性。我关心的是性能时间,而不是内存。
编辑2:
好的,我设法使用了NSBatchUpdateRequest。但问题是:我得到了nsmergeConflict。不确定如何处理这个进程。无论如何,这是代码:
- (void)resetProductUpdatedStatus
{
NSBatchUpdateRequest *request = [NSBatchUpdateRequest batchUpdateRequestWithEntityName:NSStringFromClass([Product class])];
request.propertiesToUpdate = @{@"hasUpdated" : @(NO)};
request.resultType = NSUpdatedObjectIDsResultType;
NSBatchUpdateResult *result = (NSBatchUpdateResult *)[[CoreDataUtil managedObjectContext] executeRequest:request error:nil];
[result.result enumerateObjectsUsingBlock:^(NSManagedObjectID *objId, NSUInteger idx, BOOL *stop) {
NSManagedObject *obj = [[CoreDataUtil managedObjectContext] objectWithID:objId];
if (!obj.isFault) {
[[CoreDataUtil managedObjectContext] refreshObject:obj mergeChanges:YES];
}
}];
}
这将把所有的
hasUpdated
设置为NO。接下来,我会执行同步进程。使用从同步中捕获的所有产品将更新hasUpdated
= YES。接下来执行删除操作:- (void)updateProductActiveStatus
{
NSBatchUpdateRequest *request = [NSBatchUpdateRequest batchUpdateRequestWithEntityName:NSStringFromClass([Product class])];
request.predicate = [NSPredicate predicateWithFormat:@"hasUpdated = NO"];
request.propertiesToUpdate = @{@"isActive" : @(NO)};
request.resultType = NSUpdatedObjectIDsResultType;
[[CoreDataUtil managedObjectContext] executeRequest:request error:nil];
}
正如您所看到的,我已经在更新状态中删除了合并。因此,很可能会在重置状态中引起合并冲突。所以,我想我需要修复合并进展。因此,我会问这里的人是否有任何想法。
NSBatchUpdateRequest
,否则您需要逐个处理每个对象。 - Cy-4AH