У меня есть процесс, который я периодически запускаю в фоновом потоке, который получает изменения от удаленного сервера и либо создает, обновляет, либо удаляет записи в основной таблице данных локально. Создания и обновления работают отлично. Удаление, кажется, не обрабатывается вообще. Я уверен, что упускаю что-то глупое. Какой-то код:
Очередь, которую я использую, определяется следующим образом:
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, поэтому предположительно все делается до вызова следующего блока.
Что я делаю не так?
Спасибо