2017-03-24 6 views
0

이 두 함수 호출 사이 concurency 충돌이 충돌하는 것 같다 :코어 데이터 : 저장하고 가져

MagicalRecord.save({ (localContext) in 
     let items = NewsItem.staleNewsItems(in: localContext) 
     if ((items?.count)! > 0){ 
      items?.forEach({ (item) in 
       if let object = item as? NSManagedObject { 
        object.mr_deleteEntity(in: localContext) 
       } 
      }) 
     } 
    }) 

- (void) buildAndFetchFRCsInContext:(NSManagedObjectContext*)context { 
self.newsItemsFRC = [self buildFetchResultsControllerForClass:[NewsItem class] sortedBy:@"id" withPredicate:nil inContext:context]; 

[context performBlock:^{ 
    __unused NSDate* start = [NSDate date]; 
    NSError* error; 

    [self.newsItemsFRC performFetch:&error]; // this line crashes 
    [self calculateAndBroadcastCounts]; 
}]; 
} 

이 스레드로부터 안전 전화에 저장되어 있습니까? 그렇다면이 두 기능으로 인해 서로가 충돌을 일으킬 수 있습니다.

+0

이 한 번 봐 : 난 그냥 보장 performBlockAndWait가 호출 스레드에서 실행하기 위해 저장 마법의 레코드를 사용로 전환 http://stackoverflow.com/questions/22509735/barrier-operations-in- nsoperationqueue, 동시성을위한 장벽 사용 –

답변

0

문제는 내가 만든 컨텍스트 외부의 뉴스 항목을 수정하는 것이므로 문제를 해결하기 위해 코드를 주 스레드로 옮겨야했습니다.

private static func cleanUpNewsItems() -> Void { 
    let context = NSManagedObjectContext.mr_() 
    context.performAndWait { 
     var itemsToDelete = [NSManagedObject]() 
     if let items = NewsItem.staleNewsItems(in: context) { 
      items.forEach({ (item) in 
       itemsToDelete.append(item as! NSManagedObject) 
      }) 
     } 
     for item in itemsToDelete { 
      context.delete(item) 
     } 
     do { 
      try context.save() 
     } catch let error as NSError { 
      print("Error While Deleting Note: \(error.userInfo)") 
     } 
    } 
}