Как использовать ManagedObjectContext с потоками

Это, вероятно, очень простое приложение, но я новичок в Objective-C (исходя из Java), и все ошибки управления памятью и «EXC_BAD_ACCESS» разбивают мне сердце.

У меня есть обычное iPhone-приложение NavigationController с Core Data. в AppDelegate создается NSManagedObjectContext и передается в RootViewController. Представления просматриваются непосредственно из основного потока для заполнения таблицы, и это работает нормально.

Приложение является чем-то вроде чтения RSS, поэтому, как только приложение запускается, я запускаю поток для получения новых данных и обновления представления:

-(void)updateData:(id)sender {
 UIActivityIndicatorView *activityIndicator =
    [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
 [activityIndicator startAnimating];
 UIBarButtonItem *activityItem =
    [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
 [activityIndicator release];
 self.navigationItem.leftBarButtonItem = activityItem;
 [activityItem release];

 // Start thread to update the data
 [NSThread detachNewThreadSelector:@selector(doUpdateData) toTarget:self withObject:nil];
}

-(void)doUpdateData{
 NSLog(@"Update data Thread (in 5 sec.)");
 [NSThread sleepForTimeInterval:5];

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

 DataManager *data = [[DataManager alloc] initWithContext:managedObjectContext];
 [data updateData];
 [data release];
 data=nil;

 [self performSelectorOnMainThread:@selector(finishUpdateData) withObject:nil waitUntilDone:NO]; 
 [pool release];
}

-(void)finishUpdateData{
 self.navigationItem.leftBarButtonItem = updateBttn;
 DataManager *data = [[DataManager alloc] initWithContext:managedObjectContext];
 objects = [data getArticles];
 [data release];
 data=nil;
 NSLog(@"Amount of records after update: %d", [objects count]);
 [self.tableView reloadData]; 
}

Проблема в том, что это не работает. В DataManager необходимо получить первые настройки, и как только создается NSEntityDescription, я получаю «EXC_BAD_ACCESS»:

- (NSFetchedResultsController *)fetchedResultsController {
    // Set up the fetched results controller if needed.
    if (fetchedResultsController == nil) {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Setting" inManagedObjectContext:managedObjectContext];
        [fetchRequest setEntity:entity];

        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"key" ascending:YES];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

        [fetchRequest setSortDescriptors:sortDescriptors];
  [fetchRequest setFetchLimit:1]; 
        .
        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];

        aFetchedResultsController.delegate = self;
        self.fetchedResultsController = aFetchedResultsController;

        [aFetchedResultsController release];
        [fetchRequest release];
        [sortDescriptor release];
        [sortDescriptors release];
    }

 return fetchedResultsController;
} 

Я предполагаю, что указатель на ManagedObjectContext неверен из-за работы в другом потоке и пуле памяти. Итак, как создать такое приложение, если это проблема), как мне получить ссылку на исходный формат ManagedObjectContext в потоке?

[EDIT] Я также пытался использовать

iDomsAppDelegate *appDelegate = (iDomsAppDelegate *)[[UIApplication sharedApplication] delegate];
DataManager *data = [[DataManager alloc] initWithContext:appDelegate.managedObjectContext];

в doUpdateData (как намекают другие сообщения), но это дает тот же результат


person Luuk D. Jansen    schedule 24.12.2010    source источник


Ответы (1)


Контексты управляемых объектов не являются потокобезопасными. В рекомендациях Apple указано, что вы должны иметь отдельный экземпляр NSManagedObjectContext для каждого потока.

person extremeboredom    schedule 24.12.2010
comment
Добавлена ​​ссылка на руководство Apple... в остальном коротко, по делу и точно правильно. - person bbum; 24.12.2010