Где мне нужно использовать dispatch_async для main_queue?

swift grand-central-dispatch dispatch-async

362 просмотра

2 ответа

Я обычно использую следующий код для обновления пользовательского интерфейса или всплывающего диалогового окна:

dispatch_async(dispatch_get_main_queue())
{
  ...
}

Я ясно использовать его в следующем сценарии:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  //Add some method process in global queue - normal for data processing

    dispatch_async(dispatch_get_main_queue(), ^(){
    //Add method, task you want perform on mainQueue
    //Control UIView, IBOutlet all here

    });

 //Add some method process in global queue - normal for data processing

});

Однако как насчет других случаев, например, в некоторых замыканиях или функциях обратного вызова?

autocomplete(sbYouTube.text!) { (results, status) -> Void in

                if status == "OK"
                {
                    if let results = results
                    {
                        addAutocompletes(results)
                    }

                    dispatch_async(dispatch_get_main_queue())
                    {
                        self.tvAutocomplete.reloadData()
                    }
                }
                else
                {
                    NSLog("%@", status)
                }
            }

или же

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64)
{
     dispatch_async(dispatch_get_main_queue())
     {
         self.downloadedSize = totalBytesWritten
         self.sizeToDownload = totalBytesExpectedToWrite

         self.downloadProcess.angle = Double(totalBytesWritten) * 360.0 / Double(totalBytesExpectedToWrite)
         self.lbPercent.text = "\(totalBytesWritten * 100 / totalBytesExpectedToWrite)%"
    }
}
Автор: AI Fun Источник Размещён: 08.11.2019 11:24

Ответы (2)


0 плюса

Решение
  1. Функция dispatch_get_main_queue () вернет основную очередь, в которой работает ваш пользовательский интерфейс.
  2. Функция dispatch_get_main_queue () очень полезна для обновления пользовательского интерфейса приложения iOS, поскольку методы UIKit не являются поточно-ориентированными (за некоторыми исключениями), поэтому любые вызовы, которые вы делаете для обновления элементов пользовательского интерфейса, всегда должны выполняться из основной очереди.

для более подробной информации смотрите эту ссылку

https://www.hackingwithswift.com/read/9/4/back-to-the-main-thread-dispatch_get_main_queue

Автор: app_rocker Размещён: 20.08.2016 03:06

0 плюса

Вы можете безопасно использовать этот блок:

 dispatch_async(dispatch_get_main_queue(), ^(){
    //Add method, task you want perform on mainQueue
    //Control UIView, IBOutlet all here

    });

везде, в замыканиях и функциях обратного вызова. Это гарантирует, что код в нем выполняется в основном потоке. Вы также можете использовать, NSOperationQueue.mainQueue.performBlockкак это делает то же самое

Автор: sloeberGJ Размещён: 20.08.2016 06:10
Вопросы из категории :
32x32