2015-10-07 43 views
11

有沒有什麼辦法可以例如說:的iOS Alamofire停止所有請求

Alamofire.Manager.cancelAllRequests()Alamofire.Manager.sharedInstance.cancelAllRequests()

當然,如果這些請求特別是在圖像下載的情況下只會在稍後我會調用相同的URL時暫停,但是......我至少需要能夠取消所有請求全球水平。一些建議?

在我的應用程序中,我有一個上面的Alamofire.request(.Post ....)方式的包裝,所以我真的很感激,除了上面指定的方式之外,我還不希望以另一種方式創建Manager或與Manager類進行交互。

回答

9

您應該直接使用NSURLSession方法來完成此操作。

Alamofire.Manager.sharedInstance.session.invalidateAndCancel() 

這將調用您的所有完成處理程序與取消錯誤。如果您需要恢復下載,那麼您需要從請求中獲取resumeData(如果可用)。準備就緒後,請使用恢復數據恢復請求。

+1

致電後,我無法再次提出請求 –

+0

一旦使會話失效,您需要創建一個新的請求以進行其他請求。這些都在[documentation](https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/#//apple_ref/occ/instm/NSURLSession/invalidateAndCancel)中。 – cnoon

+0

我如何創建新的? –

53

cnoon的單線解決方案很棒,但它使NSURLSession無效,您需要創建一個新線程。

另一種解決辦法是這樣(的iOS 7+):

session.getTasks { dataTasks, uploadTasks, downloadTasks in 
    dataTasks.forEach { $0.cancel() } 
    uploadTasks.forEach { $0.cancel() } 
    downloadTasks.forEach { $0.cancel() } 
} 

如果你只有定位到iOS 9+:

session.getAllTasks { tasks in 
    tasks.forEach { $0.cancel() } 
} 
+1

如果您還沒有在alamofire中配置URLSession,那麼您可以使用'Alamofire.SessionManager.default.session' – Cfr

1

如果有幫助,我得到cnoon的回答對我的工作自己的實例Alamofire.Manager。我有一個叫做NetworkHelper的單例類,它有一個名爲alamoFireManager的屬性,它處理我所有的網絡請求。我只是撥打NSURSessioninvalidateAndCancel()alamoFireManager屬性,重置我的經理setAFconfig(),然後我很好去。

class NetworkHelper { 

private var alamoFireManager : Alamofire.Manager! 

class var sharedInstance: NetworkHelper { 
    struct Static { 
     static var instance: NetworkHelper? 
     static var token: dispatch_once_t = 0 
    } 

    dispatch_once(&Static.token) { 
     Static.instance = NetworkHelper() 
    } 

    return Static.instance! 
} 
init(){ 
    setAFconfig() 
} 

func setAFconfig(){ 
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.timeoutIntervalForResource = 4 
    configuration.timeoutIntervalForRequest = 4 
    alamoFireManager = Alamofire.Manager(configuration: configuration) 
} 
func cancelAllRequests() { 
    print("cancelling NetworkHelper requests") 
    alamoFireManager.session.invalidateAndCancel() 
    setAFconfig() 
} 
1

在雨燕2.2

let session = Alamofire.Manager.sharedInstance.session 
session.getAllTasksWithCompletionHandler() { tasks in 
    tasks.forEach { $0.cancel() } 
} 
1

在完成對@ LOIS迪資格賽,你可以檢查請求的URL和取消(暫停,恢復)的要求,你需要:

downloadTasks.forEach 
      { 
       if ($0.originalRequest?.url?.absoluteString == url) 
       { 
        $0.cancel() 
       } 
      } 
1

下面的代碼停止[Swift 3]中的請求:

加上代碼適用於Alamofire v3 & v4 plus for iOS 8+

func stopTheDamnRequests(){ 
    if #available(iOS 9.0, *) { 
     Alamofire.SessionManager.default.session.getAllTasks { (tasks) in 
      tasks.forEach{ $0.cancel() } 
     } 
    } else { 
     Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in 
      sessionDataTask.forEach { $0.cancel() } 
      uploadData.forEach { $0.cancel() } 
      downloadData.forEach { $0.cancel() } 
     } 
    } 
} 

只需複製並粘貼該功能。