web-dev-qa-db-ja.com

iOS Alamofireはすべてのリクエストを停止します

私が言うことができる方法はありますか:

Alamofire.Manager.cancelAllRequests()またはAlamofire.Manager.sharedInstance.cancelAllRequests()

もちろん、特に画像のダウンロードの場合にこれらのリクエストが一時停止され、後で同じURLを生成するときにのみ一時停止するのは素晴らしいことですが、少なくともグローバルレベルですべてのリクエストをキャンセルできる必要があります。いくつかの提案?

私のアプリでは、Alamofire.request(.Post ....)の方法の上にラッパーがあるので、上で指定した以外の方法でManagerクラスを作成または操作しないでください。

19
Fawkes

これを行うには、NSURLSessionメソッドを直接使用する必要があります。

Alamofire.Manager.sharedInstance.session.invalidateAndCancel()

これにより、キャンセルエラーのあるすべての完了ハンドラが呼び出されます。ダウンロードを再開できるようにする必要がある場合は、リクエストからresumeDataを取得する必要があります(利用可能な場合)。次に、再開データを使用して、準備ができたら所定の場所で要求を再開します。

17
cnoon

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() }
}
62
ldiqual

以下のコードは、[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() }
        }
    }
}

関数をコピーして貼り付けるだけです。

9
Yash Bedi

@LoïsDi Qualが完了すると、リクエストのURLを確認して、必要なリクエストをキャンセル(一時停止、再開)できます。

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

それが役立つ場合は、_Alamofire.Manager_の自分のインスタンスで作業するためのcnoonの回答を得ました。私はすべてのネットワーク要求を処理するalamoFireManagerというプロパティを持つNetworkHelperというシングルトンクラスを持っています。そのNSURSessionプロパティでalamoFireManagerinvalidateAndCancel()を呼び出し、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
iantheparker

Swift 2.2

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

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)
    }
0
Heaven

ApiがSwiftでAlamofireを呼び出すのを停止する方法

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() } } }

0
Praveen Reddy