如果此文件已存在,请取消Alamofire文件下载

时间:2015-09-29 10:17:57

标签: ios swift alamofire request-cancelling

如果下载的文件已存在于文件夹中,如何取消Alamofire请求?

以下是请求的代码:

var request: Alamofire.Request?

我还尝试创建了一个请求变量request?.cancel(),然后取消get_page_data()该文件存在,但它不起作用。

有人可以帮我解决这个问题吗?

2 个答案:

答案 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_suspendNSOperation来克服此问题。

Grand Central Dispatch(GCD)

这种方式利用函数式编程。

在这里,我们通过低级编程来启发我们的方式。 Apple引入了一个很好的库,也就是GCD,来做一些线程级编程。

你不能取消一个块,除非......你暂停一个队列(如果它不是主队列或全局队列)。

有一个名为dispatch_suspend的C函数,(来自Apple's GCD Reference

  

void dispatch_suspend(dispatch_object_t object);

     

暂停在调度对象上调用块对象。

您还可以使用dispatch_object_t创建队列(dispatch_queue_create个)。

因此,您可以在用户创建的队列中执行任务,并且可以暂停此队列以防止CPU执行不必要的操作。

NSOperation(也是NSThread)

这种方式利用面向对象接口的函数式编程。

Apple还引入了NSOperation,其中面向对象的编程可能是对象,而更容易应对。

根据Apple的文档,

NSOperation是一个抽象类,它将代码和数据关联起来。

为了使用这个类,你应该使用它定义的一个子类,或者创建你自己的子类:特别是在你的情况下,我认为NSBlockOperation就是那个。

您可以参考以下代码块:

let block = NSBlockOperation { () -> Void in
    // do something here...
}

// Cancel operation
block.cancel()

尽管如此,它也不能保证不会停止它正在做的事情。 Apple还声明:

  

此方法不会强制您的操作代码停止。相反,它更新对象的内部标志以反映状态的变化。如果操作已完成执行,则此方法无效。取消当前在操作队列中但尚未执行的操作,可以比平时更快地从队列中删除操作。

如果你想利用旗帜,你应该阅读更多:Responding to the Cancel Command