2013-03-07 1 views
0

ОБНОВЛЕНО Версия core data update in background.Основные данные в фоновом режиме

с помощью ссылки Grand Central Dispatch (GCD) with CoreData создал фон managedObjectContext, но я получаю сообщение об ошибке при извлечении из основных данных

-(void) startTimerThread 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // Add code here to do background processing 
     NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; 
     self.backgroundManagedObjectContext = context; 
     [self.backgroundManagedObjectContext setPersistentStoreCoordinator:self.managedObjectContext.persistentStoreCoordinator]; 
     self.managedObjectContext = self.backgroundManagedObjectContext; 
     [self getDataFromFile]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Add code here to update the UI/send notifications based on the 
     // results of the background processing 

     [[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadAppDelegateTable" object:nil]; 
     [context release]; 
     self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }); 
}); 

}

и в моем getDataFromFile я получаю сообщение об ошибке при попытке извлечь от managedObjectContext

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"date == max(date)"]]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"LogDetails" inManagedObjectContext:self.managedObjectContext]; 

та же ошибка:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name LogDetails 

может кто-нибудь предложить мне, почему я получаю эту ошибку. Раньше я пытался создать дочерний файл managedObjectContext, который выдавал ту же ошибку.

Заранее спасибо.

+0

Вместо того, чтобы публиковать новый вопрос, пожалуйста, отредактируйте исходный вопрос с любыми обновлениями, которые вы хотите сделать. – Caleb

+0

ОК. Я прошу прощения. благодаря – aparna

ответ

1

Я не совсем уверен, почему вы создаете контекст и настраиваете его на self.backgroundManagedObjectContext, а затем устанавливаете его для self.managedObjectContext. Я бы предложил, чтобы ваш метод getDataFromFile принимал контекст, чтобы вы могли его вызывать из любого потока.

Вы бы

- (void)getDataFromFileOnContext:(NSManagedObjectContext *)context 
{ 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setPredicate:[NSPredicate predicateWithFormat:@"date == max(date)"]]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LogDetails" inManagedObjectContext:context]; 
} 

Тогда вы можете сделать это

-(void) startTimerThread 
{ 
    self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // Add code here to do background processing 
     NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
     [context setParentContext:self.managedObjectContext]; 
     [self getDataFromFileOnContext:context]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Add code here to update the UI/send notifications based on the 
     // results of the background processing 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadAppDelegateTable" object:nil];   
    }); 
}); 

Позвольте мне знать, если вам нужно больше помощи.