2

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

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

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

  • 获取派生自ListResults以检查其失效状态。

我想不出还有什么要寻找的。如果有更好的方法来清除不会导致所有地方出现异常的数据库,我也很高兴听到这个消息。

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

4

2 回答 2

0

Results现在有一个invalidated属性,截至 1.0.3。

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

于 2016-05-19T16:05:31.963 回答
0

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

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

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

来自 Java 的领域文档(在 Swift 文档中找不到相同的措辞):

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

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

资料来源:

Java - 类 RealmResults ,

Swift - 结果类参考

编辑:这是一个代码示例,它取自 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()
    }
  }
于 2016-05-13T07:56:29.963 回答