Swift,Alamofire取消先前的请求。

11

我有一个NetworkRequest类,其中包含所有我的Alamofire请求:

    class NetworkRequest {
        static let request = NetworkRequest()

        var currentRequest: Alamofire.Request?

        let dataManager = DataManager()
        let networkManager = NetworkReachabilityManager()
        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT

        func downloadData<T: Film>(slug: String, provider: String, section: String, dynamic: String, anyClass: T, completion: ([T]?) -> Void ) {
            var token: String = ""

            if LOGGED_IN == true {
                token = "\(NSUserDefaults.standardUserDefaults().valueForKey(TOKEN)!)"
            }

            let headers = [
                "Access": "application/json",
                "Authorization": "Bearer \(token)"
            ]

            let dataUrl = "\(BASE_URL)\(slug)\(provider)\(section)\(dynamic)"
            print(headers)
            print(dataUrl)

            if networkManager!.isReachable {

                currentRequest?.cancel()

                dispatch_async(dispatch_get_global_queue(priority, 0)) {

                    if let url = NSURL(string: dataUrl) {
                        let request = Alamofire.request(.GET, url, headers: headers)

                        request.validate().responseJSON { response in
                            switch response.result {
                            case .Success:
                                if let data = response.result.value as! [String: AnyObject]! {
                                    let receivedData = self.dataManager.parseDataToFilms(data, someClass: anyClass)
                                    completion(receivedData)
                                }

                            case .Failure(let error):
                                print("Alamofire error: \(error)")

                                if error.code == 1001 {
                                    self.goToNoConnectionVC()
                                }

                                print("canceled")
                            }

                        }
                    }
                }
            } else {
                goToNoConnectionVC()
            }
        }
}

当我需要开始一个新的downloadData请求时,我需要取消之前的请求。我试着使用currentRequest?.cancel()来取消请求,但它没有起作用。我已经使用了NSOperationsBlock来尝试取消操作,但它不能取消当前的操作。现在我阻塞了用户界面,以防止用户发送另一个请求,但这并不正确,后续会导致一些错误...请帮忙解决。
4个回答

23

现在在 Alamofire 4 中,Alamofire.Manager.sharedInstance.session 不再可用,您应该使用这个解决方案

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

如果您想取消(暂停、恢复)特定请求,则可以在.forEach块中检查请求URL,如下所示:

并且如果您想取消(暂停、恢复)特定请求,则可以在.forEach块中检查请求url,如下所示:

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

完美的答案。 - Rajan Singh

2
找到所需解决方案:
func stopAllSessions() {
    Alamofire.Manager.sharedInstance.session.getAllTasksWithCompletionHandler { tasks in
        tasks.forEach { $0.cancel() }
    }
}

Alamofire 5 更新

func stopAllSessions() {
    AF.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in
        sessionDataTask.forEach { $0.cancel() }
        uploadData.forEach { $0.cancel() }
        downloadData.forEach { $0.cancel() }
    }
}

1

Swift 5

要取消所有请求,请使用

Alamofire.Session.default.session.getTasksWithCompletionHandler({ dataTasks, uploadTasks, downloadTasks in
        dataTasks.forEach { $0.cancel() }
        uploadTasks.forEach { $0.cancel() }
        downloadTasks.forEach { $0.cancel() }
    })

要取消特定 URL 的请求,请使用

Alamofire.Session.default.session.getTasksWithCompletionHandler({ dataTasks, uploadTasks, downloadTasks in
    dataTasks.forEach {
            if ($0.originalRequest?.url?.absoluteString == "www.google.com") {
                $0.cancel()
            }
        
    }
    uploadTasks.forEach {
        if ($0.originalRequest?.url?.absoluteString == "www.google.com") {
            $0.cancel()
        }
    }
    downloadTasks.forEach {
        if ($0.originalRequest?.url?.absoluteString == "www.google.com") {
            $0.cancel()
        }
        
    }
})

0
如果你想取消请求,你需要追踪已经发出的请求并尝试取消它。你可以将它存储在一个数组中,并取消每个之前存储的请求。 在你的代码中,你创建了一个请求: let request = Alamofire.request(.GET, url, headers: headers) 但是你尝试取消一个从未赋值的currentRequest?.cancel()

我在Swift和编程方面还很新。如何将请求存储在数组中并取消它们? - Ruslan Sabirov
你可以将它存储到一个数组中,但首先请检查我的建议。 - ciccioska

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接