Core Data – объект обновления в фоновом потоке автоматически изменяет NSManagedObject в главном потоке без слияния – почему?

В настоящее время я изучаю Core Data. Основные данные велики, но я не могу объяснить поведение со вторым контекстом управляемого объекта в фоновом потоке.

У меня есть объект под названием TestEntity с 2 атрибутами (testId и testDescription). В основном потоке я извлекаю объект с помощью testId = 1 и сохраняю этот управляемый объект в переменной экземпляра.

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext]; NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; [request setEntity:entityDescription]; NSNumber *testId = [NSNumber numberWithInt:1]; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"testId == %@", testId]; [request setPredicate:predicate]; NSError *error = nil; NSArray *array = [self.managedObjectContext executeFetchRequest:request error:&error]; t1 = [[array objectAtIndex:0] retain]; TestThread *tt = [TestThread new]; NSOperationQueue *queue = [NSOperationQueue new]; [queue addOperation:tt]; [queue waitUntilAllOperationsAreFinished]; NSLog(@"%@", [t1 valueForKey:@"testDescription"]); 

Затем начинается NSOperation с NSOperationQueue, называемым TestThread. В основном методе этого TestThread я создаю второй контекст управляемого объекта, извлекаю тот же объект (testId = 1), как основной поток, изменил свойство testDescription и сохранил новый контекст без каких-либо ошибок.

  tgAppDelegate *delegate = [[NSApplication sharedApplication] delegate]; self.context = [[[NSManagedObjectContext alloc] init] autorelease]; [context setPersistentStoreCoordinator:delegate.persistentStoreCoordinator]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"TestEntity" inManagedObjectContext:self.context]; NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; [request setEntity:entityDescription]; // Set example predicate and sort orderings... NSNumber *testId = [NSNumber numberWithInt:1]; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"testId == %@", testId]; [request setPredicate:predicate]; NSError *error = nil; NSArray *array = [context executeFetchRequest:request error:&error]; TestEntity *t1 = [array objectAtIndex:0]; t1.testDescription = @"abc"; [context save:&error]; if (error) { // do something } 

Поведение, которое я не могу объяснить себе, заключается в том, что выход NSLog после

 [queue waitUntilAllOperationsAreFinished]; 

имеет такое же строковое значение, которое обновляется в моем фоновом потоке.

азбука

Мое понимание основных данных и многопоточности заключается в том, что я должен делать явное слияние между контекстами. В моем тестовом приложении нет слияния.

Может ли кто-нибудь объяснить, почему это происходит?

    По умолчанию запрос на выборку возвращает объекты как ошибки, поэтому их контент фактически не загружается до вашего доступа (вы можете узнать больше о сбоях в этой ссылке ).

    Чтобы увидеть ожидаемое поведение, попробуйте записать исходное значение t1.testDescription перед началом второго потока.

    Вы также можете установить

     self.context.returnObjectsAsFaults = NO; 

    но это может негативно повлиять на объем памяти вашего приложения.

    Interesting Posts

    Метод из категории выдает исключение после обновления до Xcode 4.2 / iOS 5

    Поиск индекса / местоположения объекта внутри массива без циклического прохождения его содержимого

    Как изменить кнопку входа по умолчанию в FBSDKLoginButton в ios?

    Бинарные SMS на iPhone

    (iOS8) установить строку состояния для освещения содержимого

    Как создать xib как для iphone & ipad с помощью xcode 6?

    Удаление при покупке приложений из новой версии приложения (iOS)

    Как разрешить определенному контроллеру просмотра поддерживать как ландшафтную, так и портретную ориентацию

    AVMetadataObjectTypePDF417Code не умеет читать драйверы драйверов штата Мэриленд

    Как я могу решить NSInternalInconsistencyException ', причина:' + entityForName: отчет об ошибке

    Повернуть поворот на 360 градусов на неопределенный срок в Swift?

    Как у вас есть два шрифта в одном UITextView (Xcode)?

    iOS 9.3 Управление цветом / профили

    Преобразование String в NSDate с помощью Swift 2

    Как изменить отображаемое имя приложения в Xcode 8, чтобы добавить пробел

    Давайте будем гением компьютера.