我的单元格有按钮触发从在线下载各自的PDF。我想要它,以便一次只能进行一次下载,而其他的(如果点击它们的按钮)则等待它完成。
我不能使用任何类型的队列,因为队列操作会调用下载方法,但在继续之前不会等待它们完成。
有没有什么方法可以让我只能继续完成完成下载功能说通过传递布尔值或其他东西准备就绪?我很迷茫,所以任何方向都非常感谢。
答案 0 :(得分:1)
我不能使用任何类型的队列,因为队列操作会调用下载方法,但在继续之前不会等待它们完成。
这可以使用NSOperation Queues来完成。关键是您的下载任务必须是异步NSOperation
子类,您在下载完成时将操作标记为已完成。更重要的是,这些操作应该在串行队列中排队。然后,操作将按FIFO顺序一次只执行一次。
然而,通过这种方式设置NSOperations需要一些样板。另一个好方法是使用Dispatch Groups。
// A serial queue ensures only one operation is executed at a time, FIFO
let downloadsQueue = dispatch_queue_create("com.youapp.pdfdownloadsqueue", DISPATCH_QUEUE_SERIAL)
let downloadGroup = dispatch_group_create()
func queueDownload(from url: NSURL) {
// Register this download task with the group
dispatch_group_enter(downloadGroup)
// Async dispatch the download task to our serial queue,
// so that it returns control back without blocking the main thread
dispatch_async(downloadsQueue) {
downloadPDF(with: url) { (pdf, error) in
// handle PDF data / error
// { .. }
// leave the dispatch group in the completion method,
// notifying the group that this task is finished
dispatch_group_leave(downloadGroup)
}
}
}
func downloadPDF(with url: NSURL, completion: (pdf: NSData?, error: ErrorType?) -> ()) {
// make network request
// call completion with PDF data or error when the download request returns
}