2016-07-30 8 views
1

私はオンラインからそれぞれのPDFのダウンロードを起動するボタンを持つセルを持っています。私は一度に1つのダウンロードしか起こらないようにし、他のものは(そのボタンがクリックされていれば)それが完了するのを待つ。Swiftでブール値がTrueになるまで待ちますか?

キュー操作はダウンロードメソッドを呼び出しますが、移動する前に完了するのを待たずに、キューの並べ替えを使用できません。

ダウンロードが完了したら、ブーリアンなどを渡して準備ができているというメッセージが表示されることはありますか?私はここでかなり失われていますので、どんな方向性も高く評価されています。

+0

GCDのチュートリアルを参照してください。あなたはディスパッチセマフォを使いたいでしょう。 – Alexander

+0

時計。この。ビデオ。 https://developer.apple.com/videos/play/wwdc2015/226/ – matt

+0

あなたはキューから1つのプロセスを完了すると、dispatch_semaphoreを使用してシグナルを送る必要があります –

答えて

1

キュー操作ではダウンロードメソッドが呼び出されますが、移動前に完了するのを待たずに、キューの並べ替えを使用できません。

これは、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 
} 
関連する問題