Alamofire取消有时不起作用

时间:2015-08-27 17:29:48

标签: ios swift alamofire

我有一个简单的请求,如:

func newRequest() {
    println("CANCEL = \(self.getTime())")
    self.request_.cancel()

    self.request_ = request(method, url)
    validate(statusCode: [200])
        .validate(contentType: ["application/json"])
        .responseJSON { [unowned self] (_, _, json, error) in

            if(error?.code == NSURLErrorCancelled ) {
                println("CANCELED!")
            }

            println("DONE LOADING = \(self.getTime())")
            // ...
    }
}

如上所示,当调用新请求时,我希望以前被取消。 它通常有效,但有时当前一个请求即将结束时(日志之间的时间非常短),它不会。

(newRequest) CANCEL = 1436103465.93128
// CANCELED! SHOULD BE HERE
(previousRequest) DONE LOADING = 1436103466.08223

为了使它工作,我添加了一个var isCanceled并检查它是否设置为true。 我不确定它是否正常工作(取消可能为时已晚)或者它是一个小错误。

1 个答案:

答案 0 :(得分:1)

你的期望是不正确的。取消不是同步行为。它是异步的,需要在调用responseJSON闭包之前跳转几个调度队列。由于您正在重新分配self.request_对新request的引用,因此您之前的请求实际上是内存不足,并且前一个请求的responseJSON关闭将永远不会被执行。

您可以使用self.request_属性存储最新请求,并使用requests集存储所有活动请求,而不是对一个请求使用单个引用。调用responseJSON闭包后,请务必从requests集中删除请求。这样,您将保留对所有请求的引用,直到它们正确取消为止。

相信我,Alamofire取消工作正常。我们的巨型测试套件表示赞同。