Ответ 1
Хмм... Вот статья об использовании Variable (обратите внимание, что Variable является оберткой вокруг BehaviorSubject.)
http://davesexton.com/blog/post/To-Use-Subject-Or-Not-To-Use-Subject.aspx
В вашем случае у вас уже есть холодный наблюдаемый (сетевой вызов), поэтому вам не требуется Тема/Переменная. Все, что вам нужно сделать, это опубликовать наблюдаемый, который у вас уже есть, и использовать replay (1) для кэширования значения. Я бы ожидал, что класс назван как-то вроде ParseServer
, который содержит вычисленное свойство с именем mushrooms
.
Чтобы помочь получить грибы из синтаксического анализа, вы можете использовать это (это создаст необходимый вам холод):
extension PFQuery {
var rx_findObjects: Observable<[PFObject]> {
return Observable.create { observer in
self.findObjectsInBackgroundWithBlock({ results, error in
if let results = results {
observer.on(.Next(results))
observer.on(.Completed)
}
else {
observer.on(.Error(error ?? RxError.Unknown))
}
})
return AnonymousDisposable({ self.cancel() })
}
}
}
И тогда у вас будет что-то вроде:
class ParseServer {
var mushrooms: Observable<[Mushroom]> {
return PFQuery(className: "Mushroom").rx_findObjects
.map { $0.map { Mushroom(pfObject: $0) } }
.publish()
.replay(1)
}
}
Я думаю, что это правильно. Я не запускал его через компилятор, но, тем не менее, тестировал его. Это может потребоваться для редактирования.
Идея состоит в том, что при первом вызове myParseServer.mushrooms
система будет вызывать Parse, чтобы вытащить грибы и кешировать их. С этого момента он просто вернет предыдущие карточные грибы.