web-dev-qa-db-ja.com

迅速、alamofireは前のリクエストをキャンセルします

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を使用してすでにcancelOperationsを試行しましたが、現在の操作はキャンセルされません。

ユーザーが別のリクエストを送信できないように、UIをブロックします。しかし、これは正しくなく、後でいくつかのエラーが発生します...

Pls、ヘルプ

9
Ruslan Sabirov

現在、Alamofire 4では、Alamofire.Manager.sharedInstance.sessionは使用できません。使用する必要があります 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() } 
}

特定のリクエストをキャンセル(一時停止、再開)する場合は、次のように.forEachブロックのリクエストURLを確認できます。

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

必要な解決策が見つかりました:

func stopAllSessions() {
    Alamofire.Manager.sharedInstance.session.getAllTasksWithCompletionHandler { tasks in
        tasks.forEach { $0.cancel() }
    }
}
2
Ruslan Sabirov

リクエストをキャンセルする場合は、行われたリクエストを追跡してキャンセルする必要があります。配列に保存して、保存されている以前のすべてのリクエストをキャンセルできます。コードでリクエストを作成します:let request = Alamofire.request(.GET, url, headers: headers)しかし、決して評価されないcurrentRequest?.cancel()をキャンセルしようとします。

0
ciccioska