RxSwift 映射问题

Posted

技术标签:

【中文标题】RxSwift 映射问题【英文标题】:RxSwift Mapping issue 【发布时间】:2017-09-19 16:05:04 【问题描述】:

我正在使用 RxSwift 和 Moya。我得到了

致命错误:在展开可选值时意外发现 nil

tableViewController 中 authors.map ... 行的错误。当我打印authors 时,我发现它是零。而且我找不到问题出在哪里。我正在使用 Moya-ObjectMapper/RxSwift 库。在最新版本中缺少 Observable+Objectmapper.swift 文件,所以我在 github 上找到并替换了它。

//import libraries

class AuthorsTableViewController: UITableViewController 

    var viewModel: AuthorsViewModelType!
    var authors: Driver<RequestResult<[Author]>>!
    private let disposeBag = DisposeBag()

    override func viewDidLoad() 
        super.viewDidLoad()
        setUpBindings()
    

    func setUpBindings() 

        tableView.dataSource = nil
        tableView.delegate = nil

        authors.map  result -> [Author] in ---> Here
            ...
            .disposed(by: disposeBag)  
    

我的视图模型:

//import libraries

public protocol AuthorsViewModelType 
    func getAuthors(destination: YazarAPI) -> Driver<RequestResult<[Author]>>


public class AuthorsViewModel: AuthorsViewModelType 
    fileprivate var provider = YazarAPI.sharedProviderInstance

    public func getAuthors(destination: YazarAPI) -> Driver<RequestResult<[Author]>> 
        return provider.request(destination)
            .observeOn(MainScheduler.instance)
            .filterSuccessfulStatusCodes()
            .mapAuthors(destination: destination)
            .map  .Success($0) 
            .asDriver(onErrorRecover:  error in
                return .just(.Error(ReqestError(description: error.localizedDescription, code: .requestError)))
            )
    


private extension Observable where E == Response 
    func mapAuthors(destination: YazarAPI) -> Observable<[Author]> 
        let authors: Observable<[Author]>

        switch destination 
        case .authors:
            authors = self.mapObject(Authors.self).map  $0.authors ?? [] 
        default:
            fatalError("Unexpected request type \"\(destination)\"")
         
        return authors
    

【问题讨论】:

【参考方案1】:

您应该为 viewModel 和 authors 属性分配值,或者如果您在某处分配它们,请将 setupBindings() 也移动到那里。 P.S.:这不是 RxSwift 的问题

【讨论】:

以上是关于RxSwift 映射问题的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift:结合不同类型的可观察对象和映射结果

开关映射的 RxSwift 等效项

RxSwift - Observable.generate - 使用附加映射处理顺序请求

tableView.rx.itemSelected 中的 RxSwift 双映射

RxSwift asDriver 映射和强自我

RXSwift 平面地图