實際發生錯誤的程式碼斷在Alamofire的Session.swift如下片段
extension Session: SessionStateProvider {
func request(for task: URLSessionTask) -> Request? {
dispatchPrecondition(condition: .onQueue(rootQueue)) // -->錯在此行
return requestTaskMap[task]
}
// 略
}
會出現此錯誤是因為App本身用了AF.request之外,又導入另一framework套件,而該套件也有使用Alamofire,使用的方式是自行建立一個新的Session如下,該套件透過自建的Session將AF.request替換成myAF.request執行各項API操作。
public let myAF: Session = {
let configuration = URLSessionConfiguration.default
configuration.requestCachePolicy = .reloadIgnoringCacheData
configuration.tlsMinimumSupportedProtocol = .dtlsProtocol12
let delegate = Session.default.delegate
let manager = Session.init(configuration: configuration,
delegate: delegate,
startRequestsImmediately: true,
cachedResponseHandler: nil)
return manager
}()
如果App本身未使用AF.request,只使用本套件,是沒有問題。但是當App有使用AF.request又導入本套件,就會因為多個執行緒造成錯誤,主要原因是因為Session的設計如下。
open class Session {
/// Shared singleton instance used by all `AF.request` APIs. Cannot be modified.
public static let `default` = Session()
}
因此,如果想要自訂configuration,又不想發生錯誤,套件內的configuration設定需要改成如下寫法
AF.session.configuration.requestCachePolicy = .reloadIgnoringCacheData
AF.session.configuration.tlsMinimumSupportedProtocol = .dtlsProtocol12
改完後,維持使用AF.request即可。