为 Alamofire 和 Argo 创建响应式扩展

Posted

技术标签:

【中文标题】为 Alamofire 和 Argo 创建响应式扩展【英文标题】:Creating reactive extension for Alamofire and Argo 【发布时间】:2016-06-14 19:14:24 【问题描述】:

您好,我的 Alamofire 响应式扩展有问题

这里是:

extension Alamofire.Manager

    func rac_jsonRequest<T : Decodable, G : ErrorType>(method: Alamofire.Method,_ URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil, encoding: ParameterEncoding = .URL, headers: [String: String]? = nil) -> SignalProducer<T,G> 

        SignalProducer<T,G>  sink, disposable in
            let request = self.request(method, URLString, parameters: parameters, encoding: encoding, headers: headers).responseJSON  response in
                if let JSON = response.result.value
                    if let decoded : T = decode(JSON) //ERROR THIS
                        sink.sendNext(decoded)
                        sink.sendCompleted()
                    
                
            
            disposable.addDisposable(request.cancel())
        
    

我收到此错误:

没有“解码”候选产生预期的上下文结果类型“T?”

【问题讨论】:

【参考方案1】:

这是由于泛型 T 在关联类型上不够完整/不够严格造成的。您尝试使用的 decode 函数类型指定如下:

func decode<T: Decodable where T == T.DecodedType>(_ object: AnyObject) -> T?

额外的where 子句是您的实现中缺少的。将其更改为此应该可以解决它:

func rac_jsonRequest<T : Decodable, G : ErrorType where T == T.DecodedType>(method: Alamofire.Method,_ URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil, encoding: ParameterEncoding = .URL, headers: [String: String]? = nil) -> SignalProducer<T,G> 

【讨论】:

以上是关于为 Alamofire 和 Argo 创建响应式扩展的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 响应创建字符串数组 Alamofire

如何使用 Alamofire 为 http 请求编写单元测试?

如何创建像 Alamofire Responses 这样的块响应?

记录alamofire上传图片请求和响应

Alamofire 自定义响应从 Alamofire v1.3 迁移到 3.0(和 Swift 2 语法)

Alamofire Void 不可转换为响应