2015-08-27 19 views
-1

我有這樣一個簡單的要求:Alamofire取消有時不工作

func newRequest() { 
    println("CANCEL = \(self.getTime())") 
    self.request_.cancel() 

    self.request_ = request(method, url) 
    validate(statusCode: [200]) 
     .validate(contentType: ["application/json"]) 
     .responseJSON { [unowned self] (_, _, json, error) in 

      if(error?.code == NSURLErrorCancelled) { 
       println("CANCELED!") 
      } 

      println("DONE LOADING = \(self.getTime())") 
      // ... 
    } 
} 

如上圖所示,在調用新的請求時,我想以前被取消。 它通常有效,但有時當前一個請求即將結束(日誌之間的時間很短)時,它不會。

(newRequest) CANCEL = 1436103465.93128 
// CANCELED! SHOULD BE HERE 
(previousRequest) DONE LOADING = 1436103466.08223 

爲了使它工作,我添加了一個var isCanceled並檢查它是否設置爲true。 我不確定它是否可以正常工作(取消它可能太遲了),或者它是一個小錯誤。

回答

1

您的期望不正確。取消不是同步行爲。它是異步的,需要跳過幾個調度隊列,然後調用responseJSON閉包。既然你是repointing的self.request_參照新request,你以前的請求實際上是走出去的內存和responseJSON關閉前一個請求將不會被執行。

您可以使用您的self.request_屬性來存儲最新的請求,並使用requests集來存儲所有活動請求,而不是對一個請求使用單個引用。一旦調用responseJSON閉包,請務必從requests集合中刪除該請求。這樣,您將保留對所有請求的引用,直到它們完成正確取消爲止。

相信我,Alamofire取消功能正常。我們的巨大測試套件同意。