web-dev-qa-db-ja.com

リクエストをキャンセルするAlamofire

タイマーに基づいてトリガーされるリクエストを送信しています。しかし、[戻る]ボタンを押すと、リクエストはまだアクティブであるように見え、レスポンスが順番にアプリをクラッシュさせます。リクエストをキャンセルする方法をご提案ください。

Xcode 8.2.1の使用Swift 3

サンプルリクエストは次のとおりです。

Alamofire.request(path!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: createHeader()).responseJSON {
    response in
    switch response.result {
    case .success(let data):
        success(data as AnyObject?)
    case .failure(let error) :
        failure(error as NSError)
    }
}

ViewDidDisappearでタイマーを無効にしようとしましたが、何の助けにもなりませんでした。

ありがとう!!

24

Alamofire 4/Swift 3/Xcode 8

以下のようにシングルリクエストをキャンセルできます。

1-最初にリクエストを取得します:

_let request = Alamofire.SessionManager.default.request(path!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: createHeader()).responseJSON { response in
    switch response.result {
    case .success(let data):
        success(data as AnyObject?)
    case .failure(let error) :
        failure(error as NSError)
    }
}
_

2-次に、viewDidDisappearで、次のように呼び出します。

request.cancel()


キャンセルできますすべてのリクエスト以下のように:

_Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in
    sessionDataTask.forEach { $0.cancel() }
    uploadData.forEach { $0.cancel() }
    downloadData.forEach { $0.cancel() }
}
_
37
Enrique

this 解決策を試しましたか:

let sessionManager = Alamofire.SessionManager.default 
sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in 
dataTasks.forEach { $0.cancel() } 
uploadTasks.forEach { $0.cancel() } 
downloadTasks.forEach { $0.cancel() } 
}

また、これがキャンセルしたいリクエストであるかどうかを確認するチェックを追加します:

dataTasks.forEach
            {
                if ($0.originalRequest?.url?.absoluteString == url)
                {
                    $0.cancel()
                }
            }
9

これはどう:

manager.session.invalidateAndCancel()
0
zero3nna