如何返回具有可选值的 Observable 序列

问题描述 投票:0回答:1

enter image description here

class Api{
    
    static let shared = Api()
    private let provider = MoyaProvider<MultiTarget>(plugins:[NetworkLoggerPlugin(),CryptoPlugin()])
    
    public func send<T : Codable>(_ target : TargetType, type : T.Type) -> Observable<T?> {
        let mTarget = MultiTarget(target)
        return provider.rx.request(mTarget)
            .asObservable()
            .filterSuccessfulStatusCodes()
            .map { result in
                print(String(data: result.data, encoding: .utf8) ?? "111")
                
                let responseModel = try JSONDecoder().decode(ResponseModel<T>.self, from: result.data)
                if(responseModel.code != 0){//bussiness error
                    let msg = (responseModel.msgCode != nil) ? Localized(key: "\(responseModel.msgCode!)") : responseModel.msg
                    UIApplication.shared.currentKeyWindow()?.showHUD(msg)
                    return nil
                }
                if(responseModel.data == nil){
                    responseModel.data = T.Type()
                }
                return responseModel.data
            }
            .catchAndReturn(T.self as? T)
    }
}

问题是有时即使没有http错误和业务错误,服务器端也会返回nil数据。在本例中,我想向订阅者返回一个空实例。这就是为什么我有这个代码:responseModel.data = T.Type()

但是正如你所看到的,有一个编译错误,我不知道发生了什么。

感谢任何建议:)

rx-swift
1个回答
0
投票

只需删除有问题的行即可。您已经确定有时服务器可以返回 nil,因此允许此函数返回 nil...

.map { result in
    print(String(data: result.data, encoding: .utf8) ?? "111")

    let responseModel = try JSONDecoder().decode(ResponseModel<T>.self, from: result.data)
    if responseModel.code != 0 { //bussiness error
        let msg = (responseModel.msgCode != nil) ? Localized(key: "\(responseModel.msgCode!)") : responseModel.msg
        UIApplication.shared.currentKeyWindow()?.showHUD(msg)
        return nil
    }
    return responseModel.data
}
© www.soinside.com 2019 - 2024. All rights reserved.