私はレルムを初めて使用し、「間違ったスレッドからアクセスされたレルム」エラーを受け取ります。取得元と同じレルムのデータにアクセスする必要があることを読みました。ただし、オブジェクトに正常にアクセスできた後、このエラーが発生します。ここにいくつかのコードがあります:
func retrieveApplicationData(completionBlock: (Results<Application>, NSError?) -> Void) {
let realm = try! Realm()
let applications = realm.objects(Application)
if applications.count > 0 {
completionBlock(applications, nil)
}
}
このメソッドは、以下を使用してアプリケーションの配列を作成するメソッドを呼び出します。let array = Array(results)
次に、これを配列を設定するメソッドに渡します。
func setApplicationItems(items: [Application]) {
applications = items
print(applications)
}
上記の方法では、配列を出力していますが、うまくいきます。ただし、サイクルの後半で、tableViewDatasource メソッド cellForRowAtIndexPath が呼び出されます。ここでは、applications 配列を使用しようとしていますが、アプリケーションが「不正なスレッド」エラーでクラッシュします。メソッドは次のとおりです。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
print("\(applications)")
let cell = ApplicationTableViewCell(style: .Subtitle, reuseIdentifier: nil)
let application = applications[indexPath.row]
cell.configureCell(application)
return cell
}
ご覧のとおり、上記のメソッドに print ステートメントを追加しました。ここにアプリケーション配列を印刷しようとすると、クラッシュします。
設定している方法で印刷できるのに、なぜクラッシュするのですか?cellForRowAtIndexPath
メインスレッドで呼び出されたからですか?もしそうなら、どうすればtableView
このインスタンスで更新できますか? 乾杯。
========
編集:
で次のことを行うとcellForRowAtIndexPath
、空の結果が返されます。
let realm = try! Realm()
let applicationsB = realm.objects(Application)
編集2:
クロージャーでの保存を処理します。データが返されたときに使用してメインスレッドに戻そうとしましdispatch_async
たが、まだクラッシュしていました。ただし、これdispatch_async
を self.tableView.reloadData() を呼び出す直前に移動しました。クラッシュしなくなったのは良いことですが、データが常に利用できるとは限りません。ブレークポイントを使用して速度を落とすと、データが返されます。ただし、実行させただけではデータはありません。バックグラウンド スレッドに保存されたデータがメイン スレッドでいつ利用可能になるかを知る方法はありますか?
私が使用しているコードは次のとおりです。
dispatch_async(dispatch_get_main_queue()) {
let realm = try! Realm()
realm.refresh()
let applicationsB = realm.objects(Application)
let array = Array(applicationsB)
self.tableViewDataSource.setApplicationItems(array as! [Application])
self.tableView.reloadData()
}
データは常に存在するとは限りません。
編集3:
save メソッドを a でラップしたところ、dispath_async(dispath_get_main_queue())
正常に動作しました。
dispatch_async(dispatch_get_main_queue()) {
let realm = try! Realm()
try! realm.write() {
let applications = data.map({ (object) -> Application in
return Application(applicationID: object.applicationID, contact: "", state: "", jobBoard: object.jobBoard, salary: object.salary, title: object.title, location: "")
})
for application in applications {
print(application)
realm.add(application)
}
//try! realm.commitWrite()
completionBlock(true, nil)
}