我有一个简单的请求,如:
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。 我不确定它是否正常工作(取消可能为时已晚)或者它是一个小错误。
答案 0 :(得分:1)
你的期望是不正确的。取消不是同步行为。它是异步的,需要在调用responseJSON
闭包之前跳转几个调度队列。由于您正在重新分配self.request_
对新request
的引用,因此您之前的请求实际上是内存不足,并且前一个请求的responseJSON
关闭将永远不会被执行。
您可以使用self.request_
属性存储最新请求,并使用requests
集存储所有活动请求,而不是对一个请求使用单个引用。调用responseJSON
闭包后,请务必从requests
集中删除请求。这样,您将保留对所有请求的引用,直到它们正确取消为止。
相信我,Alamofire取消工作正常。我们的巨型测试套件表示赞同。