2016-07-15 11 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が、データが変更された場合に、データイベントをリロードせずにムーブイベントを生成する理由を知っていれば、次のコードに置き換えられ、現在すべてが機能しています。

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を使用することもできます(これはちょっと変わっても自動的に変更をマージします...)。

関連する問題