【问题标题】:iOS Alamofire stop all requestsiOS Alamofire 停止所有请求
【发布时间】:2016-01-05 03:17:37
【问题描述】:

有什么办法可以说:

Alamofire.Manager.cancelAllRequests()Alamofire.Manager.sharedInstance.cancelAllRequests()?

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

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

【问题讨论】:

    标签: ios alamofire


    【解决方案1】:

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

    【讨论】:

    • 如果你没有在alamofire中配置URLSession,你可以通过Alamofire.SessionManager.default.session获取默认
    【解决方案2】:

    您应该直接使用NSURLSession 方法来完成此操作。

    Alamofire.SessionManager.default.session.invalidateAndCancel()
    

    这将调用所有带有取消错误的完成处理程序。如果您需要能够恢复下载,那么您需要从请求中获取resumeData(如果可用)。然后在您准备好后使用恢复数据恢复请求。

    【讨论】:

    • 调用后我无法再次提出请求
    • 一旦你使一个会话失效,你需要创建一个新的来发出额外的请求。都在documentation
    • 我怎样才能创建新的?
    • 新调用是:Alamofire.SessionManager.default.session.invalidateAndCancel() 重构为github.com/Alamofire/Alamofire/commit/…
    【解决方案3】:

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

    只需复制并粘贴函数。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果有帮助,我得到了 cnoon 的回答,可以在我自己的 Alamofire.Manager 实例上工作。我有一个名为 NetworkHelper 的单例类,它有一个名为 alamoFireManager 的属性,用于处理我的所有网络请求。我只需在 alamoFireManager 属性上调用 NSURSession 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()
        }
        

        【讨论】:

          【解决方案6】:

          在 Swift 2.2 中

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

          【讨论】:

            【解决方案7】:

            如何停止 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() }
                    }
                }
            

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                Swift 5+ & Alamofire 5.4.1

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-12-20
                  • 1970-01-01
                  相关资源
                  最近更新 更多