コアデータストアに大きなデータがあります バックグラウンドスレッドでこのデータをロードするにはどうすればよいですか?私は、バックグラウンドスレッドでコアデータロードを追加して、私のtableViewバックグラウンドスレッドでコアデータをロードする方法
0
A
答えて
1
は、最初の更新必要
func connectionCoreData() {
let fetchRequest = NSFetchRequest<PersonalClass>(entityName: "PersonalBase")
let sortDescriptor = NSSortDescriptor(key: "personName", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
if let managerObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext {
fetchResultController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managerObjectContext, sectionNameKeyPath: nil, cacheName: nil)
fetchResultController.delegate = self
do {
try fetchResultController.performFetch()
personalArray = fetchResultController.fetchedObjects!
self.tableView.reloadData()
} catch {
print(error)
}
}
}
、あなたはmanagedObjectContextは、単一のスレッドで実行されていることを念頭に置く必要があります。同じスレッド上のロードされたオブジェクトにアクセス/編集する必要があります。
あなたの場合、メインスレッドにロードするオブジェクトと対話します。たとえば、ロードされたデータベースオブジェクトはtableView
となり、これはメインスレッドで実行する必要があります。これにより、managedObjectContextはメインスレッド上で動作するMainContextTypeになります。
あなたはそれがバッチ内のオブジェクトをロードするため、メインスレッド上でNSFetchedResultsControllerを実行しているのを恐れてはなりません。ただし、FetchedResultsコントローラは必要に応じて使用していません。コード内にこれらの2行を入れてはいけません。
personalArray = fetchResultController.fetchedObjects!
self.tableView.reloadData()
このメソッドfetchResultController .objectAtIndexPath(indexPath)
を使用して、読み込まれたオブジェクトにアクセスする必要があります。
これはNSFetchedResultsController
class ViewController: UITableViewController NSFetchedResultsControllerDelegate{
lazy var fetchedResultsController: NSFetchedResultsController = {
let fetchRequest = ... //Create the fetch request
let sortDescriptor = ... //Create a sortDescriptor
let predicate = ...//Create the predicate if you want to filter the results
fetchRequest.predicate = predicate
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: mainContext, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController.delegate = self
return fetchedResultsController
}()
override fun viewDidLoad(){
super.viewDidLoad()
do {
try self.fetchedResultsController.performFetch()
}catch {
print(error)
}
}
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch (type) {
case .Insert:
if let indexPath = newIndexPath {
tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
}
break;
case .Delete:
if let indexPath = indexPath {
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
}
break;
case .Update:
if let indexPath = indexPath {
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}
break;
case .Move:
if let indexPath = indexPath, newIndexPath = newIndexPath {
tableView.moveRowAtIndexPath(indexPath, toIndexPath: newIndexPath)
}
break;
}
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let sections = fetchedResultsController.sections {
let sectionInfo = sections[section]
return sectionInfo.numberOfObjects
}
return 0
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let obj = fetchedResultsController.objectAtIndexPath(indexPath){
....
}
}
関連する問題
- 1. バックグラウンドスレッドで奇数コアデータがクラッシュする
- 2. バックグラウンドスレッドでコアデータをフェッチする方法、メインスレッドで結果を同期的に読み取る方法
- 3. バックグラウンドスレッドでペン先をロード
- 4. asp.netでデータをロードするバックグラウンドスレッド
- 5. サーバデータをバックグラウンドスレッドの問題でコアデータに保存する
- 6. バックグラウンドスレッドでサーバにデータを同期する:コアデータ内のマルチコンテキスト
- 7. MP3キュープレーヤー - バックグラウンドスレッドでロードしますか?
- 8. コアデータを持つバックグラウンドスレッドでのフェッチ要求の使用
- 9. Task.Factory.StartNewをバックグラウンドスレッドに強制する方法?
- 10. Laravel:バックグラウンドスレッドを作成する方法
- 11. バックグラウンドスレッドでUIImageをロードするとImageIOエラーが発生する
- 12. バックグラウンドスレッドからリソースにアクセスする方法
- 13. バックグラウンドスレッドでの呼び出し方法
- 14. NSSearchFieldでコアデータをロードしたフィルタデータ
- 15. バックグラウンドスレッドでコールバックを行うタスクをスワップする方法
- 16. Androidライフサイクル内のバックグラウンドスレッドからデータをロードする正しい方法は何ですか?
- 17. リレーショナルデータを保存する方法(コアデータ)
- 18. バックグラウンドスレッドで分割されたイメージを処理する方法は?
- 19. Grails 2.0 - ブートストラップまたはバックグラウンドスレッドでcreateLinkToを使用する方法
- 20. asycioバックグラウンドスレッドでaiohttpを使用する方法
- 21. RXJavaのバックグラウンドスレッドで長い計算を実行する方法
- 22. WP7でタイムアウトのバックグラウンドスレッドを作成する方法は?
- 23. libobjc.A.dylib \t objc_msgSendクラッシュがバックグラウンドスレッドのコアデータ使用で発生しています
- 24. Android - バックグラウンドスレッドで複数のジョブをキューに入れる方法
- 25. Pythonでバックグラウンドスレッドからキーボード入力を読み取る方法は?
- 26. バックグラウンドスレッドでAPIを呼び出す方法は?
- 27. 遅延とバックグラウンドスレッドでメソッドを呼び出す方法
- 28. AndroidのRoboelectricのバックグラウンドスレッドでapiを呼び出す方法
- 29. 適切な方法は、コアデータ
- 30. Springバッチジョブをバックグラウンドスレッドとして開始する方法
感謝を使用する方法の例ですが、私はコアデータに32K行を持っている(NSFetchedResultsControllerでベースのロードは数秒かかり、と私は、検索を追加したい場合このベース)と私はより速くコアデータの負荷をする必要が何をする必要がありますか?コアデータにもっと多くのリレーションシップを追加して、グループごとにリレーションを介してベースをロードしようとしてもよいでしょうか、それともこの時間もかかりますか? – Skie
本当にあなたがしようとしていることに依存します...あなたはあなたのクエリを最適化しようとする必要があります。インデックス作成を使用します。しかし、NSFetchedresultscontrollerをバックグラウンドコンテキストに置くことは、そのように使われることを意図していないため、悪夢です。 – ELKA