2016-06-24 2 views
0

이 같은 핵심 데이터를 사용코어 데이터는 이상한 충돌

- (NSManagedObjectContext *)managedObjectContext { 
@synchronized(self) { 
    if (_managedObjectContext != nil) { 
     return _managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     _managedObjectContext = [NSManagedObjectContext new]; 
     [_managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
} 

return _managedObjectContext; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
@synchronized(self) { 
    if (_managedObjectModel != nil) { 
     return _managedObjectModel; 
    } 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"DB" ofType:@"momd"]; 
    if (path) { 
     NSURL *momURL = [NSURL fileURLWithPath:path]; 
     _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 
    } 
} 

return _managedObjectModel; 
} 

을하지만 가끔은 내가 충돌이 : 컬렉션 < __NSCFSet가 : 0x14c5bffdq> 열거 된 상태로 변이되었다. 무엇이 잘못 되었나요? 멀티 쓰레딩과 함께 코어 데이터를 사용하는 방법?

답변

0

for 루프 또는 while 루프에서 코어 데이터 엔터티를 변경하거나 변경할 때이 충돌이 발생합니다. 이 같은 것이

for(NSManageObject *obj in someArray){ 
     [context deleteObject:someArray]; 
    } 

크래시 때문에 달성하고자하는 바를 변경해야 할 수도 있습니다.

이제 백그라운드 모드에서 코어 데이터를 수행하려는 경우이를 수행 할 수있는 특정 방법이 있습니다.

  • 부모 - 자식 컨텍스트는 아이 컨텍스트를 생성하고 performBlock의 모든 일을하고 자동으로 부모 MOC에 대한 변경 사항을 밀어으로 변경 사항 저장을 눌러 그 중 하나입니다.

  • 비동기 싱글 톤 큐에서 작동하지만 주 큐에서 saveContext을 수행하십시오. NSOperationQueue으로 큐를 스왑하고 싱글 톤을 생성 할 수도 있습니다. UI를 고정시키지 않으면 서 백그라운드에서 핵심 데이터 작업을 수행 할 수 있습니다.

모두는 무엇을하고 싶은지, 무엇을 달성하려고하는지에 따라 다릅니다. 더 넓은 측면에서 나는 부모 - 자녀 상황에 대해 제안 할 것입니다. 강력하며 핵심 데이터 멀티 스레딩 문제를 해결할 것입니다.

편집 -

코어 데이터에서 부모 - 자식 컨텍스트에 대한 올바른 구현을 위해 this 답을 확인하시기 바랍니다.

+0

부모 - 자식 상황이 – Flexoid

+0

을 수행하는 방법, 도와주세요은 (NSManageObject * OBJ someArray)에 대한 답 –

+0

을 편집 한 { [컨텍스트 DeleteObject 매크로 : someArray] } 이 예제에서는 하위 컨텍스트를 사용해야합니까? – Flexoid

0
*- (NSManagedObjectContext *)managedObjectContext 
{ 
    DDLogTrace(); 
    if (__managedObjectContext != nil) { 
     return __managedObjectContext; 
    } 

    dispatch_block_t initBlock = ^{ 
     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
     if (coordinator != nil) { 
      __managedObjectContext = [[NSManagedObjectContext alloc] init]; 


     } 
    }; 

    if ([NSThread isMainThread]) { 
     initBlock(); 
    }else{ 
     dispatch_sync(dispatch_get_main_queue(), initBlock); 
    } 

    return __managedObjectContext; 
}* 


Try this , many time thread swich and NSManagedObjectContext create in secondary or background thread . 
NSManagedObjectContext always execute in main thread