如果下载的文件已存在于文件夹中,如何取消Alamofire请求?
以下是请求的代码:
var request: Alamofire.Request?
我还尝试创建了一个请求变量request?.cancel()
,然后取消get_page_data()
该文件存在,但它不起作用。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
首先,你不应该取消请求,而不是取消请求。您应该在启动Alamofire请求之前进行文件检查。
如果您确实需要启动请求,则可以在启动请求后立即取消。
var shouldCancel = false
let request = Alamofire.request(.GET, "some_url") { _, _ in
shouldCancel = true
}
.progress { _, _, _ in
// todo...
}
.response { _, _, _ in
// todo...
}
if shouldCancel {
request.cancel()
}
答案 1 :(得分:0)
<强> TL; DR :在许多情况下取消请求有点麻烦。据我所知,即使是Alamofire,也不保证会立即根据您的要求取消该请求。但是,您可以使用dispatch_suspend
或NSOperation
来克服此问题。
这种方式利用函数式编程。
在这里,我们通过低级编程来启发我们的方式。 Apple引入了一个很好的库,也就是GCD,来做一些线程级编程。
你不能取消一个块,除非......你暂停一个队列(如果它不是主队列或全局队列)。
有一个名为dispatch_suspend
的C函数,(来自Apple's GCD Reference)
void dispatch_suspend(dispatch_object_t object);
暂停在调度对象上调用块对象。
您还可以使用dispatch_object_t
创建队列(dispatch_queue_create
个)。
因此,您可以在用户创建的队列中执行任务,并且可以暂停此队列以防止CPU执行不必要的操作。
这种方式利用面向对象接口的函数式编程。
Apple还引入了NSOperation
,其中面向对象的编程可能是对象,而更容易应对。
NSOperation
是一个抽象类,它将代码和数据关联起来。
为了使用这个类,你应该使用它定义的一个子类,或者创建你自己的子类:特别是在你的情况下,我认为NSBlockOperation
就是那个。
您可以参考以下代码块:
let block = NSBlockOperation { () -> Void in
// do something here...
}
// Cancel operation
block.cancel()
尽管如此,它也不能保证不会停止它正在做的事情。 Apple还声明:
此方法不会强制您的操作代码停止。相反,它更新对象的内部标志以反映状态的变化。如果操作已完成执行,则此方法无效。取消当前在操作队列中但尚未执行的操作,可以比平时更快地从队列中删除操作。
如果你想利用旗帜,你应该阅读更多:Responding to the Cancel Command