Мне нужна помощь в использовании объектов из Core Data с GCD;Кажется, я получаю NSManagedObjects, которые не попадают в основной поток, даже когда я получаю доступ к их свойствам.Буду признателен за помощь.
Это то, что я делаю: при запуске мне нужно загрузить список людей из БД базовых данных, выполнить некоторую пользовательскую обработку в фоновом режиме, а затем перезагрузить таблицу, чтобы показатьимена.Я следую рекомендациям по многопоточности Core Data, передавая только objectID в очереди GCD.Но когда я перезагружаю табличное представление в главном потоке, я никогда не вижу имя (или другие свойства), отображаемое для контактов, и при ближайшем рассмотрении NSManagedObjects оказывается ошибками в главном потоке, даже если я обращаюсь к различным свойствам вcellForRowAtIndexPath.Свойство name видно в фоновом потоке, когда я его NSLog;и он также правильно отображается в главном потоке в NSLogs в cellForRowAtIndexPath.Но они не отображаются в tableView, независимо от того, что я делаю.Я попытался получить доступ к свойству name с помощью точечной нотации, а также valueForKey, но ни одна из них не сработала.
Вот мой код….он вызывается из инициализатора FRC:
- (NSFetchedResultsController *)fetchedResultsController
{
if (__fetchedResultsController != nil)
{
return __fetchedResultsController;
}
__fetchedResultsController = [self newFetchedResultsControllerWithSearch:nil]; // creates a new FRC
[self filterAllContactsIntoDictionary: __fetchedResultsController];
return [[__fetchedResultsController retain] autorelease];
}
- (void) filterAllContactsIntoDictionary: (NSFetchedResultsController *) frc
{
NSArray *fetchedIDs = [[frc fetchedObjects] valueForKey:@"objectID"];
NSArray *fetched = [frc fetchedObjects];
if (filterMainQueue == nil) {
filterMainQueue = dispatch_queue_create("com.queue.FilterMainQueue", NULL);
}
dispatch_async(self.filterMainQueue, ^{
NSManagedObjectContext *backgroundContext = [[[NSManagedObjectContext alloc] init] autorelease];
[backgroundContext setPersistentStoreCoordinator:[[self.fetchedResultsController managedObjectContext] persistentStoreCoordinator]];
NSMutableArray *backgroundObjects = [[NSMutableArray alloc] initWithCapacity: fetchedIDs.count];
// load the NSManagedObjects in this background context
for (NSManagedObjectID *personID in fetchedIDs)
{
Person *personInContext = (Person *) [backgroundContext objectWithID: personID];
[backgroundObjects addObject:personInContext];
}
[self internal_filterFetchedContacts: backgroundObjects]; // loads contacts into custom buckets
// done loading contacts into character buckets ... reload tableview on main thread before moving on
dispatch_async(dispatch_get_main_queue(), ^{
CGPoint savedOffset = [self.tableView contentOffset];
[self.tableView reloadData];
[self.tableView setContentOffset:savedOffset];
});
});
}
Что я здесь не так делаю?Есть ли другой способ явно заставить объекты Person вызывать ошибки в главном потоке?Или я что-то не так с очередями GCD и Core Data, о которых я не знаю?Спасибо.