Как отсортировать массив элементов по атрибуту Observable? - PullRequest
1 голос
/ 17 мая 2019

У меня есть массив Observable of Objects того же класса = Observable <[MyClass]>.MyClass содержит атрибут Observable sortAttribute = Observable.Я хочу отсортировать массив в зависимости от наблюдаемого атрибута сортировки.

class MyClass {

    let title:String
    let sortAttribute:Observable<Int>

    init(withTitle title:String, andSortValue sortValue: Int) {
        self.title = title
        self.sortAttribute = Observable.just(sortValue)
    }

}

let arrayToSort:Observable<[MyClass]> = Observable.just([
    MyClass(withTitle: "A", andSortValue: 4),
    MyClass(withTitle: "B", andSortValue: 2),
    MyClass(withTitle: "C", andSortValue: 42),
    MyClass(withTitle: "D", andSortValue: 1337),
    MyClass(withTitle: "E", andSortValue: 24)
])

arrayToSort
    .subscribe(onNext: { ar in
        for element in ar {
            print(element.title)
        }
    })

Фактический результат:

A //4
B //2
C //42 
D //1337 
E //24

Ожидаемый результат:

B //2
A //4
E //24
C //42
D //1337

Ответы [ 2 ]

2 голосов
/ 17 мая 2019
arrayToSort
    .flatMap { classes in
        Observable.combineLatest(
            classes.map { elem in
                elem.sortAttribute.map { (elem, $0) }
            }
        )
    }
    .map {
        $0.sorted(by: { a, b in a.1 < b.1 }).map { $0.0.title }
    }
    .subscribe(onNext: {
        print($0)
    })
0 голосов
/ 17 мая 2019

Попробуйте это:

arrayToSort
.subscribe(onNext: { ar in
        let sortedAr = ar.sorted(by: { $0.title < $1.title })
        for element in sortedAr {
            print(element.title)
        }
    })

UPDATE: Установите свой атрибут сортировки НЕ наблюдаемый ... Просто Int

class MyClass {

    let title:String
    let sortAttribute: Int

    init(withTitle title:String, andSortValue sortValue: Int) {
        self.title = title
        self.sortAttribute = sortValue
    }

}

и затем:

arrayToSort
    .subscribe(onNext: { ar in
            let sortedAr = ar.sorted(by: { $0.sortAttribute < $1.sortAttribute })
            for element in sortedAr {
                print(element.title)
            }
        })

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

...