Alamofire request在dispatchPrecondition發生錯誤

 實際發生錯誤的程式碼斷在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即可。

沒有留言: