用泛型和完成处理程序精神解析func声明

时间:2016-07-26 07:56:14

标签: ios swift

public protocol ResponseJSONObjectSerializable {
  init?(json: SwiftyJSON.JSON)
}

public struct Response<Value, Error: ErrorType> {
...
}

public func responseArray<T: ResponseJSONObjectSerializable>(completionHandler: Response<[T], NSError> -> Void) -> Self {
...
}

到目前为止,我理解最后一个函数意味着类型声明需要泛型类型T,它遵循ResponseJSONObjectSerializable中使用的completionHandler协议Response<Value, NSError> -> Void } struct的类型声明为self,然后返回self

除了最后render(){ <View> {this.state.selectData.map((value, index) => { return ( <Text key={index}> {value} </Text> ); }) } </View> ); } 部分之外,我觉得我可以理解所有这些。

1 个答案:

答案 0 :(得分:0)

你对前两个声明是正确的。

最后一个有点奇怪,因为Alamofire如何响应序列化器。您可以链接多个这样的序列化程序:

Alamofire.request(myRequest)
  .responseString { // handle response as string }
  .responseArray { // handle response as array }

当调用该代码时,会发生这种情况:

  • Alamofire.request(myRequest)创建请求和处理程序队列
  • .responseString&amp; .responseArray将响应序列化程序添加到队列中
  • 发生网络通话
  • 完成后(无论是失败还是失败),队列会调用添加到其中的所有响应序列化程序(即.responseString&amp; .responseArray
  • 当每个序列化程序运行时,它的完成处理程序可用于&#34;返回&#34;给调用者的结果(它不能直接做,因为它是异步的)

这段代码几乎可以做同样的事情:

let manager = Alamofire.Manager.sharedInstance
manager.startsRequestImmediately = false
let alamofireRequest = manager.request(myRequest)
alamofireRequest.responseString { // handle response as string }
alamofireRequest.responseArray { // handle response as array }
alamofireRequest.resume()

manager.startsRequestImmediately = false表示在调用alamofireRequest.resume()之前,网络调用尚未开始。它默认为true,因此所有响应序列化程序都必须作为与manager.request(myRequest)相同的语句的一部分添加。

由于响应序列化器返回self,我们可以缩短它:

let alamofireRequest = manager.request(myRequest)
alamofireRequest.responseString { // handle response as string }
alamofireRequest.responseArray { // handle response as array }

对此:

let alamofireRequest = manager.request(myRequest)
  .responseString { // handle response as string }
  .responseArray { // handle response as array }

如果我们使用manager.startsRequestImmediately = true,那么我们根本不需要本地变量请求(因为我们不必调用alamofireRequest.resume()):

manager.request(myRequest)
  .responseString { // handle response as string }
  .responseArray { // handle response as array }