2016-07-15 2 views
1

NSFetchedResultsController 및 DATAStack을 사용하고 있습니다. 다른 컨텍스트에서 변경 한 경우 내 NSFetchedResultsController 내 테이블을 업데이트하지 않습니다.NSFetchedResultsController가 백그라운드 컨텍스트 (DATAStack)에서 업데이트되지 않습니다.

NSFetchedResultsController에서 dataStack.mainContext을 사용합니다. mainContext에서 업데이트를하면 모든 것이 정상입니다. 그러나 만약 내가 그런 코드를 작성한다면 :

 dataStack.performInNewBackgroundContext({ (backgroundContext) in 
      // Get again NSManagedObject in correct context, 
      // original self.task now in main context 
      let backTask = backgroundContext.objectWithID(self.task.objectID) as! CTask 

      backTask.completed = true 
      let _ = try? backgroundContext.save() 
     }) 

NSFetchedResultsController는 셀을 업데이트하지 않습니다. 예를 들어 애플리케이션이나 전체보기를 새로 고침하면 업데이트 된 데이터가 표시됩니다.

데이터 저장에 오류가 없습니다 (확인했습니다).

NSManagedObjectContextDidSaveNotification을 받았는지 확인하려고했지만 알림을받은 후 .performFetch()를 수행하면 테이블에 이전 데이터가 다시 나타납니다.

답변

1

마지막으로 알아 냈습니다. 문맥 상 문제가 아닙니다.

내가 이동입니다 NSFetchedResultsControllerDelegateNSFetchedResultsChangeType 경우에 didChangeObject FUNC의 코드와 같은 형식을 사용했습니다 (그 이벤트가 정렬의 내가 생각하기 때문에 생성 된) :

guard let indexPath = indexPath, newIndexPath = newIndexPath else { return } 
_tableView?.moveRowAtIndexPath(indexPath, toIndexPath: newIndexPath) 

을 그리고 그 잘못이다 (난 몰라 NSFetchedController가 데이터가 변경된 경우«데이터 이벤트를 다시로드하지 않고도 move 이벤트를 생성하는 이유를 알고 있습니다.), 다음 코드로 바꾸 었으며 현재 모든 것이 작동하고 있습니다.

guard let indexPath = indexPath, newIndexPath = newIndexPath else { return } 
_tableView?.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade) 
_tableView?.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: UITableViewRowAnimation.Fade) 
+0

NSFetchedResultsController의 이러한 유형의 버그로 인해 우리는 좋은 대안이 있기를 바랍니다. – 3lvis

0

다른 백그라운드 컨텍스트 옵션을 어떻게 사용해야하는지에 대해서는 문서화되어 있지 않습니다. 문제를 제기하거나 PR을 제출할 가치가 있습니다.

performInNewBackgroundContext은 변경 사항을 주 컨텍스트에 병합하지 않습니다. 이는 컨텍스트 계층 구조가 규정되어 있지 않기 때문에 수행 할 작업을 선택할 수 있기 때문입니다.

그래서 저장을 모니터링하고 변경 사항을 병합 할 수 있습니다. 또는 부모 컨텍스트를 설정할 수도 있습니다. 또는 newBackgroundContext을 사용할 수 있습니다 (이는 약간 이상하지만 ... 자동으로 변경 사항을 병합합니다 ...).