Как сортировать объекты в Realm асинхронно - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь реализовать logi c, чтобы пользователь мог сортировать представление таблицы различными способами. (имена, дата создания и размер файла)

Однако я не могу понять, как заставить мою коллекцию результатов сортировать асинхронно. Либо путем запроса базы данных для возврата отсортированных данных, таких как:

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

, либо путем сортировки самой коллекции.

Я пытался следовать документации Realm: https://realm.io/blog/obj-c-swift-2-2-thread-safe-reference-sort-properties-relationships/

, но теперь я уверен, что новая ссылка на мой scanResults не влияет на оригинал, иначе в моем tableView ничего не меняется после перезагрузки.

self.scanResults - это мои результаты или тип коллекции ScanResult

help !!

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()
    }
}

1 Ответ

0 голосов
/ 27 января 2020

Результаты области могут быть отсортированы различными способами. Согласно комментариям есть кнопка, которая позволяет сортировать данные по имени, дате и размеру.

Я не знаю, как выглядит объект, но давайте рассмотрим простой пример

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

, мы изначально загружаем результаты в и обновите tableView, чтобы отобразить их

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

и (согласно комментариям в вопросе) предположить, что в пользовательском интерфейсе есть кнопка, где пользователь может выбрать способ сортировки результатов. Если пользователь выбрал «Сортировать по имени», запускается следующий код

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...