如何解决如何使用UITableView行动画更改Realm结果的过滤视图,就好像发生了结果“更新”一样
This question主要涉及在过滤结果时如何继续观察结果,并给出了准确的答案,但没有探讨如何在更改过滤器时实现差异上的行动画。 / p>
专门假设我的表以Realm查询开头。通过一些UI小部件,用户可以向该查询添加过滤器。保持结果通知很简单,但是我想从.update
类型的RealmCollectionChange<Results>
获取行动画。我编写了以下代码来手动处理以下情况:过滤器中的更改触发观察者的.initial
情况,并使用DeepDiff
手动计算差异,将其转换为RealmCollectionChange并将其传递给用户界面的方式相同。我只想知道是否有一种使用Realm API的方法来使此操作不必要。
typealias RealmConnectionUpdate = RealmCollectionChange<Results<Connection>>
private var realmResults: Results<Connection>
private var filterResults: Results<Connection>
private(set) var filterMode: FilterMode = .All
func setFilter(mode: FilterMode) {
guard mode != filterMode else {return}
filterMode = mode
switch filterMode {
case .All:
filterResults = realmResults
case .Favorites:
filterResults = realmResults.filter(favoritesPredicate)
case .Unreplied:
filterResults = realmResults.filter(unrepliedPredicate)
}
observeResults(true)
}
private func observeResults(_ forFilterChange: Bool) {
invalidateRealmToken()
realmToken = filterResults.observe { [unowned self] (change: RealmConnectionUpdate) in
let event: ConnectionEvent
if case let .initial(results) = change,forFilterChange {
// manually compute deletions (filter applied) or additions (filter removed)
let currentItems = self.items as! Array<Connection>
let changes = diff(old: currentItems,new: Array(results))
let inserts = changes.compactMap { $0.insert?.index }
let deletes = changes.compactMap { $0.delete?.index }
let betterChange = RealmCollectionChange.update(self.filterResults,deletions: deletes,insertions: inserts,modifications: [])
event = .ConnectionsFiltered(betterChange)
} else {
event = .ConnectionsLoaded(change)
}
self.pendingNewItems = Array(self.filterResults)
self.connectionEvents.postValue(event)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。