Как проверить, что RLMResults признаны недействительными?

Когда мой пользователь выходит из системы, я очищаю свою область с помощью realm.deleteAll(), После этого я получаю много уведомлений, в результате чего Results объекты, что приводит к исключению realm::Results::InvalidatedException, "RLMResults был признан недействительным". Я не могу найти способ

  • проверить Results объект для признания недействительным напрямую;

  • проверить Results' realm объект для признания недействительным; или же

  • получить List Results получен для того, чтобы проверить его состояние недействительности.

Я не могу думать ни о чем другом, чтобы искать. Если есть лучший способ очистить базу данных, которая не приведет к исключениям повсеместно, я был бы рад услышать об этом тоже.

Дополнительная информация: исключение выдается даже при звонке count на Results объект, а не просто доступ к его объектам.

2 ответа

Вы можете проверить, существует ли первый объект, из Swift Docs:

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

Возвращает первый объект в результатах или ноль, если он пуст.

Из документации Realm для Java (не удалось найти такую ​​же формулировку в Swift Docs):

Обратите внимание, что 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()
    }
  }

Results теперь имеет invalidated собственность, по состоянию на 1.0.3.

Источник: https://github.com/realm/realm-cocoa/blob/v0.103.0/CHANGELOG.md

Другие вопросы по тегам