我是iOS开发的新手。我尝试接收存储在领域数据库中的数据,但有时我得到一个空集,尽管我可以在RealmBrowser中看到数据。通常它有效,但它不可靠。
首先,我清除存储的数据,以确保我不会显示旧数据。 之后,我将其插入RealmDatabase,除此之外,我查询所有存储的数据,以便在tableView中显示它。
这是我的代码(Swift 3):
let realm = try! Realm()
try! realm.write {
// clear all old data stored as fahrt.self
//realm.delete(realm.objects(fahrt.self));
realm.delete(realm.objects(fahrt.self));
let nsArray = try! JSONSerialization.jsonObject(with: data as Data, options: []) as! NSArray;
for eintrag in nsArray{
realm.create(fahrt.self, value: eintrag, update: false)
}
try! realm.commitWrite();
}
DispatchQueue.main.async {
let temp = ui as! DisplayViewController;
let realm = try! Realm()
let result = realm.objects(fahrt.self)
ui.showData(res: result);
// sometimes result is empty , don't know why
}
RealmModel:
class fahrt: Object {
dynamic var id: Int = 0
dynamic var date = ""
dynamic var from_lang: Double = 0.0
dynamic var from_lon: Double = 0.0
dynamic var to_lang: Double = 0.0
dynamic var to_lon: Double = 0.0
override static func primaryKey() -> String? {
return "id"
}
}
答案 0 :(得分:2)
首先,您不需要在realm.commitWrite()
块中包含realm.write { }
。 realm.commitWrite()
与realm.beginWrite()
一起使用,但这两个都在realm.write { }
内自动调用。 :)
其次,当您在后台线程上执行写入事务时,更改将在运行循环的下一次迭代中自动在主线程上公开。但是,在某些情况下,在后台写入后立即在主线程上调用代码时,可能还没有发生这种情况。要确保Realm在主线程上拥有最新的数据副本,您应该在执行查询之前在该调度块中调用realm.refresh()
。