我正在尝试将项目转换为使用RxSwift和MVVM。我有一项服务,可以在每次启动应用程序时同步来自Parse的数据列表,并且我基本上要确保采取正确的方法。RxSwift正确使用变量
我所做的是做了一个变量主题,然后让我的模型听这个。 ParseService:
let rx_parseMushrooms = Variable<[ParseMushroom]>([])
MushroomLibraryModel:
_ = parseService.rx_parseMushrooms
.asObservable()
.map { (parseMushrooms:[ParseMushroom]) -> [Mushroom] in
let mushrooms = parseMushrooms.map { (parseMushroom:ParseMushroom) -> Mushroom in
let mushroom = Mapper<Mushroom>().map(parseMushroom.dictionaryWithValuesForKeys(parseMushroom.allKeys()))
return mushroom!
}
return mushrooms
}
.subscribeNext({ (mushrooms:[Mushroom]) -> Void in
self.mushrooms = mushrooms
print(mushrooms)
})
我做表达同步状态相同。
ParseService:
struct SyncState {
enum State {
case Unsynced, ConnectingToServer, SyncingInfo, FetchingImageList, SyncingImages, SyncComplete, SyncCompleteWithError
}
var infoToSync = 0
var imagesToSync = 0
var imagesSynced = 0
var state = State.Unsynced
}
let rx_syncState = Variable(SyncState())
我再更新变量一拉
self.rx_syncState.value = self.syncState
SyncViewModel:
_ = parseService.rx_syncState
.asObservable()
.subscribeNext { [weak self] (syncState:ParseService.SyncState) -> Void in
switch syncState.state {
//show stuff based on state struct
}
}
不管怎样,我将不胜感激,如果有人可以告诉我,如果是这样的一个很好的方法去解决它,或者如果我滥用RxSwift(并指导我如何做这件事s ...)
干杯!
真棒,感谢您的回复:)对于同步状态部分呢?基本上我有一个服务类,直到图书馆同步,做了一堆东西。这个“syncLibrary()”方法在应用程序启动时被调用,但我希望有几个类能够在新蘑菇变得可用的情况下收听同步状态。我还有我显示同步进度的初始屏幕。你会不会让syncLibrary变种?这是应用程序顺便说一句,以防它更好地解释我做了什么goo.gl/xJaV0d它已经出来了我只是想要掌握RxSwift它一直在吹我的心.. – Manny
酷的应用程序。就像我引用的文章所说的,你很少需要主体(包括变量)。我认为他们主要在图书馆的那些时候,当你有一些例如需要委托而不是回叫的时候,并且你想将它转换为rx流。 –
在同步的情况下,您的DB代码应该已经被封装,以便它返回observables。有点像我上面为PFObject所做的。受试者从无到有产生热的可观察物。你的数据库不应该产生热的observables。 –