ios 如何在事件列表中按时间顺序排序?

vlf7wbxs  于 2023-05-19  发布在  iOS
关注(0)|答案(1)|浏览(206)

此代码使用RxSwift

import RxSwift
 
struct Input {
    let loadTrigger: Observable<Void>
}

protocol UseCase {
    func getEventsLists() -> Observable<[EventsList]>
    func saveEventsList(eventsList: EventsList) -> Observable<Void>
}

struct Event {
    let creationDate: Date
}

struct EventsList {
    let events: [Event]
}

var tempEventsList: EventsList? = nil

func example(useCase: UseCase, input: Input, disposeBag: DisposeBag) {
    let events = input.loadTrigger
        .flatMapLatest {
            useCase.getEventsLists()
                .map { $0.first }
                .do(onNext: { eventsList in
                    if eventsList == nil {
                        let eventsList = EventsList(events: [])
                        useCase.saveEventsList(eventsList: eventsList)
                            .subscribe(onNext: {
                                tempEventsList = eventsList
                            })
                            .disposed(by: disposeBag)
                    } else {
                        tempEventsList = eventsList
                    }
                })
                    .map { $0?.events ?? [] }
                    .asDriverOnErrorJustComplete()
        }
}

在我的iOS应用程序中,我可以创建事件来显示离既定日期还有多少时间。每个人都有自己的创作时间。事件按最后创建的事件排序(我可以手动更改顺序),因此小部件还显示最后创建的事件(我可以手动更改事件显示)。
我希望事件列表按时间顺序自动排序,从最新到最旧。

sycxhyv7

sycxhyv71#

有这个问题的简单答案,但也有一些指针...使用RxSwift的一个好处是能够摆脱“末日金字塔”。也就是在嵌套的闭包中嵌套闭包。
你没有利用这一点,因此要尽可能多的8缩进深,试图完成这项工作。这是不必要的,并且会降低可读性。让我们在回答问题时将此代码分解为单独的作业:
首先,让我们设置一个Observable<[EventsList]>变量,它在每次loadTrigger触发时发出一个新的事件列表数组。注意,我们共享这个值是因为它将在以后被多个流使用:

let eventsLists = input.loadTrigger
    .flatMapLatest { useCase.getEventsLists() }
    .share()

接下来,我们精确定义何时调用saveEventsList(eventsLists:)。只有在getEventsLists()返回空数组时才需要它。这大概可以确保下次调用它时,getEventsLists()将返回至少一个列表:

eventsLists
    .filter { $0.isEmpty }
    .map { _ in }
    .subscribe(onNext: {
        _ = useCase.saveEventsList(eventsList: EventsList(events: []))
            .subscribe()
    })
    .disposed(by: disposeBag)

现在,让我们确切地定义tempEventsList何时被分配给:

eventsLists
    .map { $0.first ?? EventsList(events: []) }
    .subscribe(onNext: { eventsList in
        tempEventsList = eventsList
    })
    .disposed(by: disposeBag)

最后,我们得到了实际的可观察事件数组。排序很简单,正如你所看到的:

let events = eventsLists
    .map { $0.first?.events.sorted(by: { $0.creationDate > $1.creationDate }) ?? [] }

所有的代码看起来像这样。每个代码块都是一个单独的、定义良好的功能块:

let eventsLists = input.loadTrigger
    .flatMapLatest { useCase.getEventsLists() }
    .share()

eventsLists
    .filter { $0.isEmpty }
    .map { _ in }
    .subscribe(onNext: {
        _ = useCase.saveEventsList(eventsList: EventsList(events: []))
            .subscribe()
    })
    .disposed(by: disposeBag)

eventsLists
    .map { $0.first ?? EventsList(events: []) }
    .subscribe(onNext: { eventsList in
        tempEventsList = eventsList
    })
    .disposed(by: disposeBag)

let events = eventsLists
    .map { $0.first?.events.sorted(by: { $0.creationDate > $1.creationDate }) ?? [] }

相关问题