【问题标题】:Cancel Alamofire.request not working (Swift)取消 Alamofire.request 不起作用(Swift)
【发布时间】:2017-03-18 15:50:52
【问题描述】:

我有一个函数,它通过 Alamofire 请求将 base64 中的字符串上传到服务器,并希望用户能够取消上传。

我目前正在尝试使用.cancel(),但我想我正在错误地使用此方法,因为它不会取消发出的请求。

代码:

var uploadVerificateRequest: Alamofire.Request?

func uploadVerificate(_ pdf: Data, completionHandler: @escaping (_ result: [String: AnyObject]) -> ()) {
    var jsonData: [String: AnyObject]?

    let PDFBase64 = pdf.base64EncodedString()

    let verificateParameters = [
        "Base64Image": PDFBase64
    ] as [String : Any]

    self.uploadVerificateRequest = Alamofire.request(URL, method: .post, parameters: verificateParameters)
        .responseJSON { (response) -> Void in

            if let value = response.result.value {
                let json = value as! [String: AnyObject]

                jsonData = json

                if let jsonData = jsonData {
                    completionHandler(jsonData)
                }
                else {
                    completionHandler([:])
                }
            }
    }
}

func cancelUploadVerificate() {
    self.uploadVerificateRequest?.cancel()
}

有什么建议吗?

【问题讨论】:

  • 另一件事,在调用 cancel() 后打印 self.uploadVerificateRequest.task 时,我在控制台中收到 "<__nscflocaldatatask:>{ taskIdentifier: 8 } { canceling }",所以 cancel()调用本身似乎有效,但请求仍在运行。

标签: swift request alamofire


【解决方案1】:

经过一些测试,找到了一个似乎可行的解决方案:

func cancelUploadVerificate() {
    self.uploadVerificateRequest.session.getAllTasks { tasks in
        tasks.forEach { $0.cancel() }
    }
}

【讨论】:

  • 你是如何测试这个的?我有类似的代码,但在单例共享实例中。
【解决方案2】:

对任务调用取消:

self.uploadVerificateRequest?.task?.cancel()

【讨论】:

  • 不幸的是,这不起作用。我也试过 self.uploadVerificateRequest?.task?.suspend() 但它仍然在运行。
  • 此外,在上传数据时和上传完成后,var uploadVerificateRequest 始终为 nil。这正常吗?
【解决方案3】:

我认为你应该尝试这样的事情:

self.uploadVerificateRequest = Alamofire.request(URL, method: .post, parameters: verificateParameters)
self.uploadVerificateRequest.responseJSON { (response) -> Void in

        if let value = response.result.value {
            let json = value as! [String: AnyObject]

            jsonData = json

            if let jsonData = jsonData {
                completionHandler(jsonData)
            }
            else {
                completionHandler([:])
            }
        }
}

【讨论】:

  • 当我尝试这个时,我收到错误“'请求类型的值?'没有成员'responseJSON'”。在函数之外,我仍在使用 var uploadVerificateRequest: Alamofire.Request?。 ://
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多