Ну нет. Если вы хотите внести изменения в контекст объекта, в котором находятся объекты Core Data, вы должны установить соответствующие свойства в указанных объектах и затем зафиксировать изменения в этом объектном контексте. Основные данные будут обрабатывать все оптимизации для вас.
Если вы просто ищете способ избежать цикла for
для обновления свойств объектов в наборе результатов, вы можете попробовать использовать makeObjectsPerformSelector:withObject:
.
NSFetchRequest *req = ...;
NSError *error = nil;
NSArray *results = [self.managedObjectContext executeFetchRequest:req error:&error];
if(error != nil) {
//oops.
} else {
//avoid the loop:
[results makeObjectsPerformSelector:@selector(setSomeProperty:) withObject:someValue];
if(![self.managedObjectContext save:nil]) {
//error during save
}
}
Для любителей приключений, вы можете попробовать добавить категорию на NSManagedObjectContext
:
@interface NSManagedObjectContext (JRAdditions)
- (BOOL) executeChanges:(NSDictionary *) changes
withFetchRequest:(NSFetchRequest *) request
error:(NSError **) error;
@end
@implementation NSManagedObjectContext (JRAdditions)
- (BOOL) executeChanges:(NSDictionary *) changes
withFetchRequest:(NSFetchRequest *) request
error:(NSError **) error {
NSArray *results = [self executeFetchRequest:request error:error];
if(*error || ![results count]) return NO;
[results makeObjectsPerformSelector:@selector(setValuesForKeysWithDictionary:)
withObject:changes];
return [self save:error];
}
@end
Затем вы можете назвать это так:
NSDictionary *changes = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
NSFetchRequest *request = ...;
NSError *error = nil;
if([self.managedObjectContext executeChanges:changes withFetchRequest:request error:&error]) {
//done.
} else {
//error.
}