为 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 创建响应式扩展的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Alamofire 为 http 请求编写单元测试?
如何创建像 Alamofire Responses 这样的块响应?