如果在通知初始化后更新结果,如何使用领域通知?
我使用带有Realm结果的UITableView作为数据源。 结果通过领域通知进行注册,并在更改发生时进行更新。 但是,同一个表视图有一个search栏,可以根据用户search查询过滤结果。 这也可以正常工作,但是如果通知侦听器识别到更新,则区段和行数不匹配。 什么是正确的方法来做到这一点? 是否可以更新NotificationToken?
这是初始化通知令牌的代码:
let realm = try! Realm() results = realm.objects(Person.self).filter("active = '1'").sorted(byProperty: "name", ascending: true) // Observe Results Notifications notificationToken = results?.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.insertRows(at: insertions.map { IndexPath(row: $0, section: 0) }, with: .automatic) tableView.deleteRows(at: deletions.map { IndexPath(row: $0, section: 0) }, with: .automatic) tableView.reloadRows(at: modifications.map { IndexPath(row: $0, section: 0) }, with: .automatic) tableView.endUpdates() break case .error(let error): // An error occurred while opening the Realm file on the background worker thread print("Error: \(error)") break } }
此代码根据用户searchinput更新结果:
func updateSearchResults(for searchController: UISearchController) { let searchText = searchController.searchBar.text! if searchText.isEmpty == false { results = results?.realm?.objects(Person.self).filter("active = '1'") results = results?.filter("name BEGINSWITH[c] %@ OR lastName CONTAINS[c] %@", searchText, searchText) results = results?.sorted(byProperty: "name", ascending: true) self.tableView.reloadData() } else { results = results?.realm?.objects(Person.self).filter("active = '1'").sorted(byProperty: "name", ascending: true) self.tableView.reloadData() } }
如果执行了searchqwuery,并且在领域数据库更新之前,则会发生NSRangeexception。
您将覆盖updateSearchResults()
results
。 通知和notificationToken
绑定到特定的Results
对象和查询。 因此,如果您通过另一个查询覆盖results
,则应该停止先前的通知,然后将通知重新添加到新的results
对象。
所以updateSearchResults()
方法应该如下所示:
func updateSearchResults(for searchController: UISearchController) { let searchText = searchController.searchBar.text! if searchText.isEmpty == false { results = results?.realm?.objects(Person.self).filter("active = '1'") results = results?.filter("name BEGINSWITH[c] %@ OR lastName CONTAINS[c] %@", searchText, searchText) results = results?.sorted(byProperty: "name", ascending: true) } else { results = results?.realm?.objects(Person.self).filter("active = '1'").sorted(byProperty: "name", ascending: true) } notificationToken.stop() notificationToken = results?.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in guard let tableView = self?.tableView else { return } switch changes { case .initial: tableView.reloadData() break case .update(_, let deletions, let insertions, let modifications): tableView.beginUpdates() tableView.insertRows(at: insertions.map { IndexPath(row: $0, section: 0) }, with: .automatic) tableView.deleteRows(at: deletions.map { IndexPath(row: $0, section: 0) }, with: .automatic) tableView.reloadRows(at: modifications.map { IndexPath(row: $0, section: 0) }, with: .automatic) tableView.endUpdates() break case .error(let error): print("Error: \(error)") break } } }
- 作为成员的领域对象保存后为零
- RealmSwift初始化程序 – Xcode修复程序 – 它一直搞错了
- 将RealmSwift作为子项目添加:缺less所需的模块:“Realm.Private”,“Realm”
- 如何在iOS上处理Realm React Native迁移和schemaVersion?
- UITextfield becomeFirstResponder返回NO
- 领域结果对象types
- 迁移多个领域 – 领域版本大于模式版本exception
- Realm将数据追加到List <t>types
- 如何在iOS项目中正确configurationRealm DB文件(<db_name> .realm)的path?