文章

读源码深度学习Swift用法

读Alamofire

使用泛型巧妙的使各类去进行extension扩展

参考JKPop,见这篇文章

线程安全@Protected使用

详细见这篇文章

判断当前线程是否具备可靠性dispatchPrecondition

1
2
3
4
aDispatchQueue.async {
    dispatchPrecondition(condition: .onQueue(.main))
    self.view.alpha = 1
}

确保在aDispatchQueue中操作UI属性前,确保此线程是主线程。类似如下:

1
guard Thread.isMainThread else { return }

参考文章介绍

闭包参数实现函数内部值修改 RequestModifier

1
2
3
/// Closure which provides a `URLRequest` for mutation.
/// 一个提供可修改的URLRequest参数的闭包
public typealias RequestModifier = (inout URLRequest) throws -> Void

RequestModifierAlamofire的请求函数最后一个入参。

1
2
3
4
5
6
7
open func request(_ convertible: URLConvertible,
                      method: HTTPMethod = .get,
                      parameters: Parameters? = nil,
                      encoding: ParameterEncoding = URLEncoding.default,
                      headers: HTTPHeaders? = nil,
                      interceptor: RequestInterceptor? = nil,
                      requestModifier: RequestModifier? = nil) -> DataRequest 

例如,我们需要实现请求的超时设置,Alamofire的封装积累Request是没法直接修改URLRequest的,我们可以如下进行

1
2
3
4
5
6
7
8
9
10
11
12
/// timeoutInterval传递超时时间
AF.request(requestUrl, method: .post, parameters: parameters, headers: headers, requestModifier: { $0.timeoutInterval = 5 }).responseJSON { (response) in
    /// 这里是处理返回数据的逻辑
}

AF.request(requestUrl, method: .post, parameters: parameters, headers: headers){ urlRequest in
    /// 这个闭包可以设置URLRequest一些相关的参数
    /// 请求超时时间
    urlRequest.timeoutInterval = 15
}.responseJSON { (response) in
    /// 这里是处理返回数据的逻辑
}

内部是这样调用的

1
2
3
4
5
6
func asURLRequest() throws -> URLRequest {
  var request = try URLRequest(url: url, method: method, headers: headers)
  try requestModifier?(&request)

  return try parameters.map { try encoder.encode($0, into: request) } ?? request
}
本文由作者按照 CC BY 4.0 进行授权