2017-11-17 23 views
0

tableViewに既に保存されているデータを表示するのにNSFetchedResultsControllerを使用しています。同時に、私は新しいデータをWebサービスでチェックしています。ネットワークからデータを受信すると、データベースは新しいデータで更新されます。 tableViewは自動的に更新されます。 tableViewの更新がスムーズではありません。 swift 4に適したソリューションをご提供ください。 私はより良い説明のためにアップロードしたこのビデオをご覧ください。 https://www.youtube.com/watch?v=XhSEykQcP5A&feature=youtu.beUITableViewのデータ更新がスムーズでない

これは、あなたがこの試すことができます私のNSFetchedResultsControllerデリゲートの実装

extension CoreDataTableViewController: NSFetchedResultsControllerDelegate { 
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    tableView.beginUpdates() 
} 

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) { 
    let set = IndexSet(integer: sectionIndex) 
    switch (type) { 
    case .insert: 
     tableView.insertSections(set, with: .fade) 
    case .delete: 
     tableView.deleteSections(set, with: .fade) 
    default: 
     break 
    } 
} 

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { 
    switch(type) { 
    case .insert: 
     tableView.insertRows(at: [newIndexPath!], with: .fade) 
    case .delete: 
     tableView.deleteRows(at: [indexPath!], with: .fade) 
    case .update: 
     tableView.reloadRows(at: [indexPath!], with: .fade) 
    case .move: 
     tableView.deleteRows(at: [indexPath!], with: .fade) 
     tableView.insertRows(at: [newIndexPath!], with: .fade) 
    } 
} 

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    tableView.endUpdates() 
} 
+3

私たちに 'NSFetchedResultsController'デリゲート実装 –

+0

NSFetchedResultsControllerデリゲート実装を示す質問を編集しました。 reloadData()をどこでも呼び出すわけではありません。 –

答えて

0

私はこの問題を解決しました。

以前は、NSManagedObjectがすべて生成された後、saveContextを1回だけ(forループの後に)使用していました。今、NSManagedObjectを生成した後にsaveContextを使用しています。以下は、NSManagedObjectを作成して保存しているコードのスニペットです。

     for z in 0...(json.count - 1) { 
         let a = json[z]["PackageName"].stringValue 
         let b = json[z]["ExamGroupId"].stringValue 
         let c = json[z]["TestList"].stringValue 
         let d = json[z]["TestPackageId"].stringValue 
         _ = TestPackage(packageNameCD: a, examGroupIdCD: b, testListCD: c, testPackageIdCD: d, context: self.fetchedResultsControler.managedObjectContext) 
         (UIApplication.shared.delegate as! AppDelegate).saveContext() // now I am saving here itself and not after the loop. 

        } 
        // (UIApplication.shared.delegate as! AppDelegate).saveContext() // earlier, I was saving here, after the for loop. 

まだ完全に理解していません。しかし、それは問題を解決します。 私はそれをさらに説明できる人には非常に感謝します。

1

です:

tableView.beginUpdates() 
    tableView.endUpdates() 

アップルは言う:あなたは、その後の挿入をしたい場合は

は、このメソッドを呼び出し、削除を、および の選択oper ations。

...

あなたは、グループ内のreloadDataを()を呼び出すべきではありません。この メソッドをグループ内で呼び出す場合は、自分でアニメーションを実行する必要があります。

関連する問題