此代码使用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应用程序中,我可以创建事件来显示离既定日期还有多少时间。每个人都有自己的创作时间。事件按最后创建的事件排序(我可以手动更改顺序),因此小部件还显示最后创建的事件(我可以手动更改事件显示)。
我希望事件列表按时间顺序自动排序,从最新到最旧。
1条答案
按热度按时间sycxhyv71#
有这个问题的简单答案,但也有一些指针...使用RxSwift的一个好处是能够摆脱“末日金字塔”。也就是在嵌套的闭包中嵌套闭包。
你没有利用这一点,因此要尽可能多的8缩进深,试图完成这项工作。这是不必要的,并且会降低可读性。让我们在回答问题时将此代码分解为单独的作业:
首先,让我们设置一个
Observable<[EventsList]>
变量,它在每次loadTrigger触发时发出一个新的事件列表数组。注意,我们共享这个值是因为它将在以后被多个流使用:接下来,我们精确定义何时调用
saveEventsList(eventsLists:)
。只有在getEventsLists()返回空数组时才需要它。这大概可以确保下次调用它时,getEventsLists()将返回至少一个列表:现在,让我们确切地定义
tempEventsList
何时被分配给:最后,我们得到了实际的可观察事件数组。排序很简单,正如你所看到的:
所有的代码看起来像这样。每个代码块都是一个单独的、定义良好的功能块: