如何在 Realm 中对对象进行异步排序



我正在尝试实现用户以不同方式对表视图进行排序的逻辑。(名称、创建日期和文件大小(

但是,我不知道如何让我的结果集合异步排序。通过查询数据库返回排序数据,例如:

realm.objects(ScanResult.self(.sorted(byKeyPath: "creationDate"(,

或通过对集合本身进行排序。

我尝试遵循 Realm 文档:https://realm.io/blog/obj-c-swift-2-2-thread-safe-reference-sort-properties-relationships/

但是现在,我很确定对我拥有的扫描结果的新引用不会影响原始引用,即重新加载后我的 tableView 没有任何变化。

self.scanResults 是我的结果或类型 ScanResult 集合

帮助!!

func sortScansByName(completion: @escaping(() -> Void)) {
let threadSafeScans = ThreadSafeReference(to: self.scanResults)
DispatchQueue.global(qos: .background).async {
let backgroundRealm = try! Realm()
var resolvedScans = backgroundRealm.resolve(threadSafeScans)!
backgroundRealm.beginWrite()
resolvedScans = resolvedScans.sorted(byKeyPath: "title")
try! backgroundRealm.commitWrite()
completion()
}
}

Realm 结果可以通过多种方式进行排序。根据注释,有一个按钮可以按名称,日期和大小对数据进行排序。

我不知道对象是什么样子,但让我们使用一个简单的例子

class ScanClass: Object {
@objc dynamic var name = ""
@objc dynamic var date = ""
@objc dynamic var size = 0
}

我们将创建三个 ScanClass 对象并将它们存储在 Realm 中。

let s0 = ScanClass()
s0.name = "scan 0"
s0.date = "20191201"
s0.size = 100
let s1 = ScanClass()
s1.name = "scan 1"
s1.date = "20200115"
s1.size = 50
let s2 = ScanClass()
s2.name = "scan 2"
s2.date = "20190701"
s2.size = 12
//write the objects to realm

我们有一个类结果对象来存储结果

class ViewController: NSViewController {
var scanResults: Results<ScanClass>? = nil

我们最初加载结果并更新表视图以显示它们

override func viewDidLoad() {
super.viewDidLoad()
self.scanResults = realm.objects(ScanClass.self)
self.scanTableView.reloadData()

并且(根据问题中的注释(假设 UI 中有一个按钮,用户可以在其中选择如何对结果进行排序。如果用户选择了"按名称排序",则运行以下代码

self.scanResults = realm.objects(ScanClass.self).sorted(byKeyPath: "name", ascending: true)
self.scanTableView.reloadData
scan 0 20191201 100
scan 1 20200115 50
scan 2 20190701 12

那么如果用户选择"按日期排序">

self.scanResults = realm.objects(ScanClass.self).sorted(byKeyPath: "date", ascending: true)
self.scanTableView.reloadData
scan 2 20190701 12
scan 0 20191201 100
scan 1 20200115 50

最后,如果用户选择"按大小排序">

self.scanResults = realm.objects(ScanClass.self).sorted(byKeyPath: "size", ascending: true)
self.scanTableView.reloadData
scan 2 20190701 12
scan 1 20200115 50
scan 0 20191201 100

显然,如果您想记住用户上次选择按该选项排序的内容,可以存储在用户默认值或 Realm 中,以便下次显示 tableView 时,它将自动按他们上次选择的选项进行排序。

最新更新