Reload Tableview using RxSwift

2020-06-05 06:10发布

I am using RxSwift for tableview. I need to reload my table each time after getting data from api but I'm failed to do this. I couldn't find any solution for that. Can anybody help?

I have an array of places obtain from response of an Api.I have used this code in view did load, but its is not being called when array is updated.

enter image description here

3条回答
太酷不给撩
2楼-- · 2020-06-05 06:39

I have found the issue. My array was not being getting updated correctly. I did the following changes.

Declare dataSource variable of ModelClass:

let dataSource = Variable<[SearchResult]>([])

Bind it with the table view right now it is empty:

dataSource.asObservable().bindTo(ResultsTable.rx.items(cellIdentifier: "SearchCell")){ row,Searchplace,cell in
    if let C_cell = cell as? SearchTableViewCell{
        C_cell.LocationLabel.text = Searchplace.place
    }
}.addDisposableTo(disposeBag)

Then store my updated array in it that contains the searchPlaces:

dataSource.value = self.array

Now each time when value of dataSource will be changed, table view will be reloaded.

查看更多
不美不萌又怎样
3楼-- · 2020-06-05 06:44

Avoid using "Variable" because of this concept will be deprecated from RxSwift but official migration path hasn't been decided yet.

REF: https://github.com/ReactiveX/RxSwift/issues/1501

Hence, recommend using RxCocoa.BehaviorRelay instead.

let dataSource = BehaviorRelay(value: [SearchResultModel]())

Bind to tableView

 self.dataSource.bind(to: self.tableView.rx.items(cellIdentifier: "SearchCell", cellType: SearchCell.self)) { index, model, cell in
      cell.setupCell(model: model)
 }.disposed(by: self.disposeBag)

after fetch data:

let newSearchResultModels: [SearchResultModel] = ..... //your new data
dataSource.accept(newSearchResultModels)

Hope this can help :)

查看更多
甜甜的少女心
4楼-- · 2020-06-05 06:54

Let

array = Variable<[SearchResult]>([])

Whenever you hit your API, put your fetched results in self.array.value and it will automatically gets updated.

 self.array.asObservable().bindTo(ResultsTable.rx.items(cellIdentifier: "SearchCell", cellType:SearchCell.self)) 
   { (row, element, cell) in
        cell.configureCell(element: element)
   }.addDisposableTo(disposeBag)
查看更多
登录 后发表回答