Подтвердить что ты не робот

Dispatch_async на main_queue?

Я видел этот фрагмент кода:

dispatch_async(dispatch_get_main_queue(), ^{
    [self doSomeNetworkStuff];
});

Это не похоже на меня.

РЕДАКТ. Чтобы уточнить условия моего вопроса:

  • Вызов dispatch_async выполняется из основного потока.
  • Отправленное сообщение doSomeNetworkStuff - это задача рабочего тяжелого лифта.
  • ... и это не только задача обновления пользовательского интерфейса.

Отправка, конечно, но с использованием основной очереди просто верните отправленную задачу обратно в поток ui и заблокируйте ее.

Прошу, я что-то упустил? Спасибо.

4b9b3361

Ответ 1

dispatch_async позволяет вашему приложению запускать задачи во многих очередях, поэтому вы можете увеличить производительность. Но все, что взаимодействует с пользовательским интерфейсом, должно выполняться в основном потоке. Вы можете запускать другие задачи, которые не связаны с пользовательским интерфейсом за пределами основного потока, для повышения производительности.

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

});

Ответ 2

Swift 3:

DispatchQueue.global(attributes: .qosBackground).async {
    print("This is run on the background queue")

    DispatchQueue.main.async {
        print("This is run on the main queue, after the previous code in outer block")
    }
}

Ответ 3

когда вы хотите сделать какой-либо Webservicecall или что-то, что вы отправляете асинхронный вызов, как показано ниже:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
        //Call your webservice here , your app will not freeze at all  
});

Теперь предположим, что вы хотите обновить или нажать ViewController из вашего отправленного потока, если вы прямо нажмете на него viewcontroller, приложение может или может потерпеть крах, так как такие обновления пользовательского интерфейса должны быть выполнены в основном потоке приложения, ниже ответ для этого тогда.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
       //Call your webservice here , your app will not freeze at all

       //To update UIFrom dispatched Thread:

       dispatch_async(dispatch_get_main_queue,^{   

       //Push view controller here
});

});

для подробного посещения: blackberrymastercracks.blogspot.in

Ответ 4

Это зависит от того, откуда этот код вызывается. Значит, если его вызов из основной очереди, то это не имеет смысла. (Примечание: это не приведет к сбою, но просто добавит задачу в основную очередь).

Если этот код написан в фоновом потоке, то это точка схождения для приложения. Подобно тому, как вы получаете данные из веб-службы в фоновом потоке, затем хотите обновить его в пользовательском интерфейсе, вы можете его вызвать.

-(void) backgroundThreadFunction {

     //Some stuff on background thread. 

     dispatch_async(dispatch_get_main_queue(), ^{
         //Wants to update UI or perform any task on main thread.    
         [self doSomeNetworkStuff];
     });
}

Более подробную информацию о документации Apple можно найти https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html или из этого ответа также fooobar.com/questions/57375/...

Отправляй меня, если все еще неясно. Я напишу подробный ответ.

Ответ 5

Обычно вы увидите этот синтаксис внутри другого вызова dispatch_async, который выполняется в фоновом потоке. Это связано с тем, что все обновления пользовательского интерфейса должны выполняться в основном потоке, а не в фоновом режиме.