iOS Alamofire 停止所有请求

问题描述 投票:0回答:10

我有什么办法可以说:

Alamofire.Manager.cancelAllRequests()
还是
Alamofire.Manager.sharedInstance.cancelAllRequests()

当然,如果这些请求(特别是在图像下载的情况下)仅在稍后我调用相同的 URL 时暂停,那就太好了,但是......我至少需要能够在全局级别取消所有请求。一些建议?

在我的应用程序中,我在 Alamofire.request(.Post....) 的做事方式之上有一个包装器,所以我真的很感激不要让我以除上面指定的方式之外的其他方式创建或与 Manager 类交互。

ios alamofire
10个回答
68
投票

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

24
投票

您应该直接使用

NSURLSession
方法来完成此操作。

Alamofire.SessionManager.default.session.invalidateAndCancel()

这将调用所有带有取消错误的完成处理程序。如果您需要能够恢复下载,则需要从请求中获取

resumeData
(如果可用)。然后,当您准备好时,使用恢复数据恢复请求。


16
投票

下面的代码停止 [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() }
        }
    }
}

只需复制并粘贴该函数即可。


3
投票

Swift 5+ 和 Alamofire 5.4.1

        AF.session.getAllTasks { (tasks) in
            tasks.forEach {$0.cancel() }
        }

2
投票

完成 @Loïs Di Qual 后,您可以检查请求 url 并取消(暂停、恢复)您需要的请求:

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

1
投票

如果有帮助,我得到了 cnoon 的答案,可以在我自己的

Alamofire.Manager
实例上工作。我有一个名为 NetworkHelper 的单例类,它有一个名为 alamoFireManager 的属性,它处理我的所有网络请求。我只需调用
NSURSession
属性上的
invalidateAndCancel()
alamoFireManager
,在
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
投票

在 Swift 2.2 中

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

1
投票

如何在swift中停止Api调用Alomofire

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

1
投票

在 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
投票

如果你想在没有任何第三方的情况下创建请求,那么你可以像这样创建

    var userObj: LoginUser_Codable?

var dict = [String:Any]()

        dict["name"] =  "kaushik"
        dict["salary"] =  "123"
        dict["age"] =  "23"
        
        var request = URLRequest(url: URL(string: "https://dummy.restapiexample.com/api/v1/create")!)
        request.httpMethod = "POST"
        request.httpBody = try? JSONSerialization.data(withJSONObject: dict, options: [])
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        let session = URLSession.shared
        let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
            print(response!)
            do {
                let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
                print(json)
                
                if let data = json["data"] as? [String: Any]
                {
                    let jsonData = try JSONSerialization.data(withJSONObject: data, options: .prettyPrinted)
                    let reqJSONStr = String(data: jsonData, encoding: .utf8)
                    let data = reqJSONStr?.data(using: .utf8)
                    let jsonDecoder = JSONDecoder()
                    let uObj = try jsonDecoder.decode(LoginUser_Codable.self, from: data!)
                    print(json)
                }
                

            } catch {
                print("error")
            }
        })

        task.resume()

创建模型

import Foundation
import UIKit

//MARK: - User
struct LoginUser_Codable: Codable
{
    var emailAddress : String?
    var firstName      : String?
    var id        : Int?
    var name    : String?
    
    
    enum CodingKeys: String, CodingKey {
        case id
        case emailAddress
        case firstName
        case name
        
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.