2013-03-07 5 views
0

기본적으로 UI를 차단하지 않고 백그라운드 스레드에서 핵심 데이터를 업데이트하고 저장해야합니다. 저장 후 테이블보기를 다시로드하여 변경 사항을 확인해야합니다. 그래서이 작업을 수행하는 나는백그라운드에서 핵심 데이터 업데이트

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // Add code here to do background processing 
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    self.backgroundManagedObjectContext = context; 
    if(self.managedObjectContext == nil) 
     self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    self.backgroundManagedObjectContext.parentContext = self.managedObjectContext; 

    //update data 
    [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]; 
    }); 
}); 

를 사용하여 생각하고 getDataFromFile에 나는 데이터

if(![NSThread isMainThread]) 
{ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LogDetails" inManagedObjectContext:self.backgroundManagedObjectContext]; 
    [request setEntity:entity]; 
    logs = [self.backgroundManagedObjectContext executeFetchRequest:request error:nil]; 
} 

내가 응용 프로그램을 종료 * 인해 캐치되지 않는 예외 'NSInternalInconsistencyException', 이유에 오류를 얻기를 가져 오기 할 때 ' + entityForName : 엔티티 이름 'LogDetails'에 대한 NSManagedObjectModel을 찾을 수 없음 '

왜이 오류가 발생하는지 설명 할 수있는 사람

또한 메인 인 스레드 managedObjectContext로서 managedObjectContext 또는 parent managedObjectContext를 부모 스레드로 포함할지 여부에 대해서는 의문의 여지가 있습니다.

+0

나는이 위대한 튜토리얼을 읽는 것이 좋습니다 : http://www.cocoanetics.com/2012/07/multi-context-coredata/ – rckoenes

+0

나는 몇 링크를 읽습니다. http://stackoverflow.com/questions/2138252/ core-data-multi-thread-application, http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html, http://www.cimgf.com/2011/05/04/core-data-and-threads-the-headache없이 그리고 여전히 링크를 포함하여 http://www.cocoanetics.com/2012/07/multi-context-coredata/하지만 여전히 나는 아닙니다 내가 잘못 가고있는 곳을 찾을 수있다 – aparna

+0

어디서 parentObject를 설정합니까? 'self.backgroundManagedObjectContext = main.managedObjectContext'처럼'NSPrivateQueueConcurrencyType'을 사용할 때'PersistentStoreCoordinator'를 설정할 필요가 없으며'[self.backgroundManagedObjectContext performBlock : (block)]'을 사용해야합니다. – rckoenes

답변

1

NSManagedContext는 하나의 스레드에서만 사용해야합니다. 스레드간에 NSManagedObject를 전달하면 잠재적으로 안전하지 않습니다.

관련 문제