CoreData не обрабатывает удаление при выполнении в фоновом потоке - PullRequest
2 голосов
/ 13 января 2012

У меня есть процесс, который я периодически запускаю в фоновом потоке, который получает изменения от удаленного сервера и либо создает, обновляет, либо удаляет записи в основной таблице данных локально. Создания и обновления работают отлично. Удаление, кажется, не обрабатывается вообще. Я уверен, что упускаю что-то глупое. Какой-то код:

Очередь, которую я использую, определяется следующим образом:

self.concurrentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

Настройка NSTImer, которая регулярно вызывает следующий селектор:

-(void)poll {
    void(^blkSyncDeletedItems)(void)=^{
        if ([PFUser currentUser]) {
        AN3AppDelegate* theDelegate=[[UIApplication sharedApplication]delegate];
        NSManagedObjectContext* blkmoc=[[NSManagedObjectContext alloc]init];
        [blkmoc setPersistentStoreCoordinator:[theDelegate persistentStoreCoordinator]];

        NSNotificationCenter* notify=[NSNotificationCenter defaultCenter];
        [notify addObserver:theDelegate selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object:blkmoc];

        NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Deleted" inManagedObjectContext:blkmoc];

        NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
        [request setEntity:entityDescription];

        NSError* error=nil;
        NSArray *array = [blkmoc executeFetchRequest:request error:&error];

        ... look up some data on the remote server, not manipulating objects in array...

        for (int i=0; i<[array count]; i++) {
            Deleted* aDelete=[array objectAtIndex:i];
            [blkmoc deleteObject:aDelete];
        }

        [blkmoc release];
        [[NSNotificationCenter defaultCenter]removeObserver:theDelegate];
    };

    dispatch_sync(concurrentQueue, blkSyncDeletedItems);
}

Наконец, mergeChanges выглядит так:

* * 1010

Как я уже сказал, у меня есть другие блоки, которые отправляются в concurrentQueue, которые обновляют и создают, используя очень похожий код (те же настройки в начале и конце блока), и они работают нормально. Когда удаление 'обрабатывается', метод mergeChanges никогда не вызывается.

Все вызывается с dispatch_sync, поэтому предположительно все делается до вызова следующего блока.

Что я делаю не так?

Спасибо

1 Ответ

3 голосов
/ 14 января 2012

Вам нужно позвонить -[NSManagedObjectContext save:].

...