如何在RxSwift中将多个数据模型绑定到TableView

时间:2019-09-06 09:14:58

标签: swift alamofire rx-swift swift5

我正在研究RxSwift。 但这很困难,所以我提出了一个问题。

情况: 我想在tableView中显示字符的信息。 角色具有项目信息和化身信息。 (有两个API。)

问题: 我在tableView中成功显示了一个数据模型(项目信息)。 但是我不知道如何将两个或多个模型绑定到tableView。

这是将一个模型绑定到tableView时的代码。

ViewModel:

minifyEnabled true

ViewController:

let characterDetail = PublishSubject<CharacterDetailResp>()
var characterDetailInfo : CharacterDetailResp = CharacterDetailResp()
let error : PublishSubject<CharacterDetailError> = PublishSubject()

func requestData() {
        let URL : String = "\(baseUrl)/servers/characterName/"

        AF.request(URL, method: .get, parameters:nil, encoding: JSONEncoding.default).responseObject {
        (response : DataResponse<CharacterDetailResp>) in

        switch response.result {
        case .success:
            self.characterDetailInfo = response.value!
            self.characterDetail.onNext(self.characterDetailInfo)

        case .failure(let err):
            if err.localizedDescription == "The Internet connection appears to be offline." {
                self.error.onNext(.internetError("Please Check Internet"))
            }
            else {
                self.error.onNext(.serverMessage(err.localizedDescription))
            }
        }
    }
}

我想知道如何将两个或更多个API模型绑定到TableView

请帮助我。...

1 个答案:

答案 0 :(得分:0)

我只需要实现类似这样的东西。这是我所做的:

https://

这是使用方法:

final class SearchDataSource: NSObject, RxTableViewDataSourceType, UITableViewDataSource {
    func tableView(_ tableView: UITableView, observedEvent: Event<SearchResult>) {
        switch observedEvent {
        case .next(let result):
            searchResult = result
            tableView.reloadData()
        case .error(let error):
            fatalError(error.localizedDescription)
        case .completed:
            break
        }
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch section {
        case 0:
            return searchResult.titles.count
        case 1:
            return searchResult.bodies.count
        default:
            fatalError("too many sections")
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch indexPath.section {
        case 0:
            let segment = searchResult.titles[indexPath.row]
            let cell = tableView.dequeueReusableCell(withIdentifier: "Title", for: indexPath) as! TitleTableViewCell
            cell.configure(with: segment)
            return cell
        case 1:
            let segment = searchResult.bodies[indexPath.row]
            let cell = tableView.dequeueReusableCell(withIdentifier: "Body", for: indexPath) as! BodyTableViewCell
            cell.configure(with: segment)
            return cell
        default:
            fatalError("too many sections")
        }
    }

    var searchResult = SearchResult(titles: [], bodies: [])
}

final class TitleTableViewCell: UITableViewCell {
    func configure(with segment: TitleSegment) { }
}

final class BodyTableViewCell: UITableViewCell {
    func configure(with segment: BodySegment) { }
}

struct SearchResult {
    let titles: [TitleSegment]
    let bodies: [BodySegment]
}

struct TitleSegment {
    let sectionID: Int
    let title: String
}

struct BodySegment {
    let sectionTitle: String
    let sectionID: Int
    let text: String
}