读源码深度学习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
RequestModifier
是Alamofire
的请求函数最后一个入参。
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 进行授权