Хорошо ...
Конструктор Observable.just(loveData)
создаст Observable, который генерирует массив один раз и затем завершается.В конечном итоге вам нужно будет перечислить все входные данные, которые могут привести к изменению представления сбора, и использовать их в качестве входных данных в collectionData
Observable.
Но сейчас, чтобы ваши ноги промокли, выможно просто использовать тему:
class MainFeedViewController : BaseViewController
{
var loveData: [FeedDataModel] = []
let collectionData = PublishSubject<[FeedDataModel]>()
// ...
collectionData.asObservable().bind(to: collectionView!.rx.items(cellIdentifier: cellId))
// ...
private func loadDummyData()
{
addObj()
collectionData.onNext(loveData)
}
@objc func addObj()
{
let obj1 = FeedDataModel.init(image: "https://via.placeholder.com/150",title: "Placeholder")
print("adding object")
loveData.append(obj1)
collectionData.onNext(loveData)
}
Класс PublishSubject
является самым основным типом субъекта.Он действует как Наблюдаемый и Наблюдатель.Таким образом, вы можете вставить значения в него с помощью onNext()
, и когда вы это сделаете, он отправит эти значения любому наблюдателю, который подписывается или привязывается к нему.Поскольку представление вашей коллекции связано с ним, это означает, что представление коллекции будет получать события по мере их отправки.
Но это только начало!Использование подобного предмета - это всего лишь способ преобразовать императивный код в декларативный стиль, к которому вас подталкивает Rx.
Чтобы воспользоваться всеми преимуществами системы, вам придется думать немного по-другому.Вместо того, чтобы думать: «Когда пользователь делает X, приложение должно делать Y».вам придется систематизировать свои мысли в духе: «Этот вывод изменяется всякий раз, когда происходят такие вещи».
Возможно, это так же просто, как: «Представление коллекции должно обновляться из сетевого запроса всякий раз, когда пользователь нажимает накнопка обновления. Если запрос не удался, не обновляйте список. "Что бы выглядело примерно так:
refreshButton.rx.tap
.flatMap {
getRequestResponse()
.catchError { _ in Observable.empty() }
}
.bind(to: collectionView!.rx.items(cellIdentifier: cellId, cellType: FeedCollectionViewCell.self)) { _, data, cell in
cell.imgMAIN.downloaded(link: (data.image?.absoluteString)! )
cell.lblTitle.text = data.title
}
.disposed(by: disposeBag)
Или то, что, по-видимому, хотел видеть ваш код: «Сборное представление должно начинаться с одной записи и получать дополнительную запись каждые 5 секунд».Который будет выглядеть примерно так:
Observable<Int>.interval(5, scheduler: MainScheduler.instance)
.scan(into: [FeedDataModel.init(image: "https://via.placeholder.com/150",title: "Placeholder")]) { current, _ in
current.append(FeedDataModel.init(image: "https://via.placeholder.com/150",title: "Placeholder"))
}
.bind(to: collectionView!.rx.items(cellIdentifier: cellId, cellType: FeedCollectionViewCell.self)) { _, data, cell in
cell.imgMAIN.downloaded(link: (data.image?.absoluteString)! )
cell.lblTitle.text = data.title
}
.disposed(by: disposeBag)