一旦創建Alamofire.Request
,它就會創建一個NSURLSessionTask
,並且一旦創建,它就是有效的只讀。所以我發現的唯一選擇是推遲創建Request
,直到我的請求即將運行。
但是,Request
對象是您設置響應處理程序的對象。例如,客戶想要調用類似於:request().response(...).response(...)
。 Alamofire的request()
返回Request
對象,您可以多次調用response()
,以便設置一旦請求完成就會運行的響應處理程序。但是,如果您需要推遲創建Request
,直到您知道它即將運行爲止,以便您可以在當時使用最新的標頭,那麼您如何將其返回給客戶端,以便他們可以撥打.response()
?
我所做的是創建一個myRequest()
包裝(而不是能夠覆蓋實際request()
功能/名)在我的Alamofire.Manager
派生類,這需要1個附加參數的方式 - 一個「請求準備」塊(它本身需要Alamofire.Request
)而不是返回Request
myRequest()
,myRequest()
,不會返回任何內容,而是在請求即將分派時調用該塊(將其傳遞給Request
)。
因此,像
manager.request(.GET, "endpoint").responseJSON(…)
,而不是成爲
manager.myRequest(.GET, "endpoint") { request in
request.responseJSON(...)
}
這樣我可以推遲Alamofire.Request
的創建(這立即產生,因爲它們是潛在的頭NSURLSessionTask
和鎖在那個時候),直到後來,而不是在他們指定響應處理程序的方式上過多地給客戶造成不便。
myRequest()
看起來像這樣(不包括應用程序特定的東西):
func myRequest(
method: Alamofire.Method,
_ URLString: URLStringConvertible,
parameters: [String: AnyObject]? = nil,
encoding: ParameterEncoding = .URL,
headers: [String: String]? = nil,
requestReady: ((Request) -> Void)?) {
pendingRequestsQueue.addOperationWithBlock { [weak self] in
if let strongSelf = self {
let request = strongSelf.request(method, URLString, parameters: parameters, encoding: encoding, headers: headers)
if let requestReady = requestReady {
requestReady(request)
}
request.resume()
}
}
}
你設法找到對的方法嗎? – Yaman
是的,沒有。請參閱下面的答案。 – iraxef