如何检查RLMResults无效?

时间:2016-05-13 05:33:45

标签: ios swift realm realm-cocoa

当我的用户退出时,我会使用realm.deleteAll()清除我的领域。在此之后,我收到大量通知,导致Results个对象的读取,导致异常realm::Results::InvalidatedException,“RLMResults已失效”。

我无法找到方法
  • 直接检查Results对象是否失效;

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

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

我想不出别的东西要找。如果有更好的方法来清除数据库,不会导致异常,我也很高兴听到这个。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

  

请注意,即使RealmResults不包含任何对象,它也永远不会为null。您应该始终使用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()
    }
  }

答案 1 :(得分:0)

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

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