【问题标题】:How to check for RLMResults invalidated?如何检查 RLMResults 无效?
【发布时间】:2016-05-13 05:33:45
【问题描述】:

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

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

  • 检查 Results' realm 对象是否失效;或

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

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

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

【问题讨论】:

标签: ios swift realm realm-cocoa


【解决方案1】:

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

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

返回结果中的第一个对象,如果为空,则返回 nil。

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

请注意,RealmResults 永远不会为空,即使在它不包含任何对象的情况下也是如此。您应该始终使用 size() 方法来检查 RealmResults 是否为空。

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

来源:

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()
    }
  }

【讨论】:

  • Results对象上调用count时会发生异常,所以我不认为是这样。
  • 再一次,我不是在寻找空的,我在寻找无效的。当通知触发时,无论其中有什么,我都会重新加载我的表格视图;检查count 会引发异常。
【解决方案2】:

Results 现在有一个 invalidated 属性,从 1.0.3 开始。

来源:https://github.com/realm/realm-cocoa/blob/v0.103.0/CHANGELOG.md

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2016-01-16
    • 2014-12-15
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多