キュー操作ではダウンロードメソッドが呼び出されますが、移動前に完了するのを待たずに、キューの並べ替えを使用できません。
これは、NSOperation Queuesを使用して実行できます。重要なのは、ダウンロードタスクが非同期のNSOperation
サブクラスでなければならないことです。さらに重要なことは、これらの操作をシリアルキューに入れることです。すると、操作はFIFO順に一度に1つだけ実行されます。
しかし、NSOperationsをこのように設定するには、少しの定型化が必要です。これを行うもう1つの良い方法は、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
}
GCDのチュートリアルを参照してください。あなたはディスパッチセマフォを使いたいでしょう。 – Alexander
時計。この。ビデオ。 https://developer.apple.com/videos/play/wwdc2015/226/ – matt
あなたはキューから1つのプロセスを完了すると、dispatch_semaphoreを使用してシグナルを送る必要があります –