0

Data was imported and bound using api. And I want to apply it to the table view and take data to the detailed view using Rxswift when selecting the table view. But there's an error. What's wrong? enter image description here

Fetch Service

        func fetchCovidCenter() -> Observable<[Center]> {
        return Observable.create { observer -> Disposable in
            let task = URLSession.shared.dataTask(with: URL(string: CENTER_LIST_URL)!) { data, _, _ in
                guard let data = data else {
                    observer.onError(NSError(domain: "", code: -1, userInfo: nil))
                    return
                }
                do {
                    let covid = try JSONDecoder().decode(Covid.self, from: data)
                    let centers = covid.data
                    observer.onNext(centers)
                }catch {
                    observer.onError(error)
                }
            }
            task.resume()
            return Disposables.create {
                task.cancel()
            }
        }
    }

Model

    struct Covid : Decodable {
    let page : Int
    let perPage : Int
    let totalCount : Int
    let currentCount : Int
    let data : [Center]
}
struct Center : Decodable {
    let id : Int
    let centerName : String
    let sido : String
    let sigungu : String
    let zipCode : String
    let facilityName : String
    let phoneNumber : String
    let createdAt : String
    let lat : String
    let lng : String
    let updatedAt : String
    let address : String
    let org : String
    let centerType : String
}

TableView

  tableView.register(CenterTableViewCell.self, forCellReuseIdentifier: CenterTableViewCell.identifier)
        tableView.rx.setDelegate(self).disposed(by: disposeBag)
        
        guard let viewModel = viewModel else { return }
        viewModel.fetchCenterViewModels().observe(on: MainScheduler.instance).bind(to: tableView.rx.items(cellIdentifier: CenterTableViewCell.identifier,cellType: CenterTableViewCell.self)) { (index,viewModel,cell) in
            //It's working.
            cell.viewModel = viewModel
        }.disposed(by: disposeBag)
        
        tableView.rx.modelSelected(Center.self).observe(on: MainScheduler.instance).subscribe(onNext: { (item) in
            //It's Error
            print(item)
        }).disposed(by: disposeBag)
        
        tableView.rx.itemSelected.subscribe(onNext: { item in
            //It's working.
            print(item)
        }).disposed(by: disposeBag)
이진성
  • 1
  • 1
  • 1
    The answer is in the error. Your code is trying to select a `Center` but the data source contains `CenterViewModel`s. – Daniel T. Jan 04 '22 at 22:52

1 Answers1

1

itemSelected property is a reactive wrapper for delegate message tableView:didSelectRowAtIndexPath: of type ControlEvent, so there is a really low chance, that something might go wrong. However, modelSelected is a method which tries to cast model to T.Type under the hood. If we take a look at your screenshot, we will see, that this is exactly what is causing the error.

So just try to replace your modelSelected subscription with this:

tableView.rx.modelSelected(CenterViewModel.self).observe(on: MainScheduler.instance).subscribe(onNext: { (item) in
    //It's Error
    print(item)
}).disposed(by: disposeBag)
Bulat Yakupov
  • 440
  • 4
  • 13