2016-07-17 6 views
2

코어 데이터를 동시에 적절하게 사용하는 방법을 찾는 데 어려움을 겪고 있습니다.코어 데이터, 동시성 및 GCD

업데이트가있을 때마다 새 데이터를 추가하기 전에 엔터티의 핵심 데이터를 지워야합니다. 그러므로 나는이 조각을 사용하기로 결정했습니다

-(void)addSale:(NSArray *)results{ 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    NSString *entity = @"Sale"; 

    CoreDataManager.sharedInstance.delegate = self; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [CoreDataManager.sharedInstance deleteEntityWithName:entity]; 
    }); 

    NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    privateContext.parentContext = CoreDataManager.sharedInstance.managedObjectContext; 

    for (NSDictionary *dataDictionary in [results valueForKey:@"Sales"]) 
    { 
     NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:privateContext]; 


     // Fill ManagedObject 
     // ..... 

    } 

    NSError *error; 
    [privateContext save:&error]; 

    if (error != nil) { 
     NSLog(@"Couldn't save private context bcoz of %@\n%@", error, error.localizedDescription); 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Save Main ManagedObjectContext 
     [CoreDataManager.sharedInstance saveContext:CoreDataManager.sharedInstance.managedObjectContext WithEntityName:entity]; 
    }); 
}); 
} 

문제는 코어 데이터에 어떤 영향없이 반응하는 UI를 유지하면서 내가이 개 다른 기업을 위해 같은 일을해야한다는 것입니다.

더 나은 접근 방법이 있습니까?

답변

2
  1. NSPersistentStoreCoordinator과 관련된 개인 컨텍스트를 만듭니다.
  2. 개인 컨텍스트에서 개체를 삭제하십시오.
  3. 개인 컨텍스트를 저장하십시오.
  4. 이러한 객체 중 하나라도 사용 중이면 재설정 할 기본 대기열 컨텍스트를 알립니다.

주 컨텍스트에서 개체를 삭제할 이유가 없습니다 (사용자가 자신의 단독 개체를 사용하고있는 것처럼 보입니다).

삭제하려는 개체를 UI가 건드리지 않은 경우 사용자 인터페이스와 관련된 컨텍스트를 다시 설정할 필요가 없습니다.

재설정을 수행하는 대신 기본 대기열 컨텍스트에서 개인 대기열 컨텍스트의 저장 통지를 사용하고 동일한 결과를 얻게 할 수도 있습니다.