У нас возникает проблема, когда разные потоки видят разные данные в одних и тех же записях, но с разными контекстами управляемых объектов (moc). Наше приложение синхронизируется в фоновом режиме с серверным API. Вся синхронизация выполняется в собственном потоке и с использованием собственного moc. Однако мы обнаружили, что при обновлении данных в основном файле moc это изменение данных не отображается в фоновом файле moc. Есть идеи, что могло случиться? Вот еще несколько деталей: мы используем grand central dispatch, например, чтобы поместить операции синхронизации в свой собственный поток: мы проверили, в какой очереди выполняются вещи, и все это происходит в ожидаемой очереди.
- (void) executeSync; {
dispatch_async(backgroundQueue, ^(void) {
if([self isDebug])
NSLog(@"ICSyncController: executeSync queue:%@ \n\n\n\n\n", [self queue]);
for(id <ICSyncControllerDelegate> delegate in delegates){
[delegate syncController:self];
}
if([ICAccountController sharedInstance].isLoggedIn == YES && shouldBeSyncing == YES) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 300ull * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
[self executeSync];
});
}
});
}
вот как мы создаем фоновый moc, и мы подтвердили, что он создан в фоновой очереди.
- (NSManagedObjectContext*)backgroundObjectContext {
if (_backgroundObjectContext)
return _backgroundObjectContext;
_backgroundObjectContext = [[NSManagedObjectContext alloc] init];
[_backgroundObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
[_backgroundObjectContext setStalenessInterval:0.0];
return _backgroundObjectContext;
}
Я должен добавить, что наш фоновый moc запрашивает данные, и те записи, которые возвращаются из этого действия, по-прежнему имеют старые значения для некоторых полей. Как фоновый moc получает текущие данные, которые уже были сохранены основным moc? Я думал, что просто запросив, я получу текущее состояние этих записей ..
под запросом я имею в виду следующее: фоновый MOC выполняет другой «запрос» для получения «свежих» данных после того, как записи были изменены основным moc, но данные имеют старые значения, а не обновленные значения, видимые в основном moc.
+ (NSArray *)dirtyObjectsInContext:(NSManagedObjectContext *)moc {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(memberships, $m, $m.category.name == %@ AND $m.syncStatus > %d).@count > 0", MANAGED_CATEGORY_FAVORITES, ManagedObjectSynced];
return [self managedObjectsWithPredicate:predicate inContext:moc];
}
Мы очень ценим вашу помощь, поскольку мы пытаемся разобраться в этом или найти решение, которое не включает в себя отключение наших обсуждений на несколько дней.