2015-09-03 66 views
2

我正在創建Alamofire請求,並將startRequestsImmediately設置爲false。然後我將一個塊排入一個NSOperationQueue,該請求調用resume()。如果我需要中止外發請求,我只需暫停隊列並讓它們緩衝起來。一旦我取消暫停隊列,就會分派任何請求。在恢復之前修改Alamofire請求上的標題()d

有時,當隊列被暫停時,我需要在那裏的任何現有請求(例如授權令牌)上更改標頭。我還沒有找到辦法做到這一點(我嘗試的任何東西都沒有生效)。 NSURLSessionTask有可能嗎?是否有可能換出NSURLSessionTask給定的請求(帶有更新的頭文件)?

+0

你設法找到對的方法嗎? – Yaman

+0

是的,沒有。請參閱下面的答案。 – iraxef

回答

2

一旦創建Alamofire.Request,它就會創建一個NSURLSessionTask,並且一旦創建,它就是有效的只讀。所以我發現的唯一選擇是推遲創建Request,直到我的請求即將運行。

但是,Request對象是您設置響應處理程序的對象。例如,客戶想要調用類似於:request().response(...).response(...)。 Alamofire的request()返回Request對象,您可以多次調用response(),以便設置一旦請求完成就會運行的響應處理程序。但是,如果您需要推遲創建Request,直到您知道它即將運行爲止,以便您可以在當時使用最新的標頭,那麼您如何將其返回給客戶端,以便他們可以撥打.response()

我所做的是創建一個myRequest()包裝(而不是能夠覆蓋實際request()功能/名)在我的Alamofire.Manager派生類,這需要1個附加參數的方式 - 一個「請求準備」塊(它本身需要Alamofire.Request)而不是返回RequestmyRequest(),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() 
     } 
    } 
}