Поясните работу Managed object context
Непонятна из документации следующая строка:
Within a given context, there is at most one managed object to represent any given record in a persistent store.
Источник: Stack Overflow на русском
Непонятна из документации следующая строка:
Within a given context, there is at most one managed object to represent any given record in a persistent store.
Каждая запись (NSManagedObject
) существует исключительно в пределах своего контекста (NSManagedObjectContext
). Если есть объект и работа с ним ведется в main thread NSManagedObejctContext
и мы создали новый контекст для работы в background
, мы не можем просто взять и редактировать в нем объект, например:
// берем default main thread контекст
NSManagedObjectContext *context = [(FRAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
// создаем в нем entity
FRUser *user = [NSEntityDescription insertNewObjectForEntityForName:@"FRUser" inManagedObjectContext:context];
// создаем child context для работы в бакграунде
NSManagerObjectContext *tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.parentContext = context;
[tempContext performBlock:^{
//мы НЕ МОЖЕМ сделать так:
user.uid = 10001;
user.name = @"";
// мы пытаемся изменить запись из другого контекста
// правильным будет:
NSError *error = nil;
FRUser *localUser = [tempContext existingObjectWithID:[user objectID] error:&error];
// и дальше уже можем менять объект localUser и сохранять. Так же мы не может установить relationship между объектами из разных контекстов, делать все нужно по тому же принципу.
}];