私が言うことができる方法はありますか:
Alamofire.Manager.cancelAllRequests()
またはAlamofire.Manager.sharedInstance.cancelAllRequests()
?
もちろん、特に画像のダウンロードの場合にこれらのリクエストが一時停止され、後で同じURLを生成するときにのみ一時停止するのは素晴らしいことですが、少なくともグローバルレベルですべてのリクエストをキャンセルできる必要があります。いくつかの提案?
私のアプリでは、Alamofire.request(.Post ....)の方法の上にラッパーがあるので、上で指定した以外の方法でManagerクラスを作成または操作しないでください。
これを行うには、NSURLSession
メソッドを直接使用する必要があります。
Alamofire.Manager.sharedInstance.session.invalidateAndCancel()
これにより、キャンセルエラーのあるすべての完了ハンドラが呼び出されます。ダウンロードを再開できるようにする必要がある場合は、リクエストからresumeData
を取得する必要があります(利用可能な場合)。次に、再開データを使用して、準備ができたら所定の場所で要求を再開します。
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() }
}
以下のコードは、[Swift 3]でリクエストを停止します。
さらに、コードはAlamofire v3&v4で機能し、さらに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() }
}
}
}
関数をコピーして貼り付けるだけです。
@LoïsDi Qualが完了すると、リクエストのURLを確認して、必要なリクエストをキャンセル(一時停止、再開)できます。
downloadTasks.forEach
{
if ($0.originalRequest?.url?.absoluteString == url)
{
$0.cancel()
}
}
それが役立つ場合は、_Alamofire.Manager
_の自分のインスタンスで作業するためのcnoonの回答を得ました。私はすべてのネットワーク要求を処理するalamoFireManagerというプロパティを持つNetworkHelperというシングルトンクラスを持っています。そのNSURSession
プロパティでalamoFireManager
invalidateAndCancel()
を呼び出し、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()
}
_
Swift 2.2
let session = Alamofire.Manager.sharedInstance.session
session.getAllTasksWithCompletionHandler() { tasks in
tasks.forEach { $0.cancel() }
}
Alamofire5では、以下を使用できます。
/// cancel all request in APIManager session
/// - Parameter completion: Closure to be called when all `Request`s have been cancelled.
func cancelAllRequest(completion: (() -> Void)? = nil) {
self.session.cancelAllRequests(completion: completion)
}
class func StopAPICALL() {
let sessionManager = Alamofire.SessionManager.default
sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
dataTasks.forEach { $0.cancel() }
uploadTasks.forEach { $0.cancel() }
downloadTasks.forEach { $0.cancel() }
}
}