gpt4 book ai didi

ios - 如何检查 RLMResults 是否失效?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:00:28 25 4
gpt4 key购买 nike

当我的用户注销时,我使用 realm.deleteAll() 清除我的 Realm 。在此之后,我收到了很多导致从 Results 对象读取的通知,这导致异常 realm::Results::InvalidatedException,“RLMResults 已失效”。我找不到办法

  • 直接检查一个Results对象是否失效;

  • 检查 Resultsrealm 对象是否失效;或者

  • 获取 List Results 的派生来源,以检查其失效状态。

我想不出还有什么可以寻找的。如果有更好的方法来清除数据库,不会导致所有地方出现异常,我也很乐意听到。

附加信息:即使在 Results 对象上调用 count 时也会抛出异常,而不仅仅是访问其对象。

最佳答案

您可以检查第一个对象是否存在,来自 Swift 文档:

public var first: T? { return rlmResults.firstObject() as! T? }

Returns the first object in the results, or nil if empty.

来自 Realm Documentation for Java(在 Swift 文档中找不到相同的措辞):

Notice that a RealmResults is never null not even in the case where it contains no objects. You should always use the size() method to check if a RealmResults is empty or not.

长话短说,检查第一个对象是否存在或尝试对元素进行计数。

来源:

Java - Class RealmResults ,

Swift - Results Class Reference

编辑:这是一个代码示例,它取自 Realm 示例并根据我的需要进行了修改,他们使用通知标记来检测数组是否为空

class Record: Object {
dynamic var workoutName = ""
dynamic var totalTime = ""
dynamic var date = ""
}
let realm = try! Realm()
let array = try! Realm().objects(Record).sorted("date")

var notificationToken: NotificationToken?

override func viewDidLoad() {
super.viewDidLoad()

setupUI()

// Set results notification block

notificationToken = array.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in
guard let tableView = self?.tableView else { return }
switch changes {
case .Initial:
// Results are now populated and can be accessed without blocking the UI
tableView.reloadData()
break
case .Update(_, let deletions, let insertions, let modifications):
// Query results have changed, so apply them to the UITableView
tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.endUpdates()
break
case .Error(let error):
// An error occurred while opening the Realm file on the background worker thread
fatalError("\(error)")
break
}
}
}

我还使用 deleteAll() 清除了表格:

  func clearTable() {
try! realm.write {
realm.deleteAll()
}
}

关于ios - 如何检查 RLMResults 是否失效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37201922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com