Использование блоков и GCD для управления задачами

Я изучаю iOS, и когда дело доходит до GCD, это сбивает с толку. Давайте разберемся, я пишу небольшую программу, которая извлекает данные из Интернета. Вот мой вьюконтроллер

NSMutableArray dataArray = [NSMutableArray array];

[querysomethingwithblock:(^ {
   //do some stuff here
   [otherquerywithblock:( ^ {
       //do some stuff here
       // Here I got the data from internet
       // Do loop action
       [dataArray addObject:data];
   })];


})];
// here I want to perform some actions only after get data from internet
[self performAction:dataArray];

Как я могу достичь этой цели. На практике [self performAction:dataArray] всегда увольняют до того, как я получу данные. Я пытался играть с GCD, но не повезло.

Вот некоторые шаблоны, которые я пробовал до сих пор

dispatch_async(queue, ^{
    // Do query stuff here
    dispatch_async(dispatch_get_mainqueue(), ^{
       //perform action here
    });
{;

Или используя dispatch_group_async, dispatch_group_wait, dispatch_group_notify

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

Большое спасибо за любой совет.


person babygau    schedule 19.09.2013    source источник
comment
Вызовите PerformAction из блока otherqueryblock ! Если вам нужно быть в определенном потоке, используйте GCD или встроенные методы в NSObject -performSelector:onMainThread: ...   -  person Nicolas Thenoz    schedule 19.09.2013
comment
Извините, приятель, я редактирую код для лучшего понимания, объясните, почему я не могу поместить `[self PerformAction:dataArray] в этот блок   -  person babygau    schedule 19.09.2013


Ответы (1)


Я предполагаю, что часть кода под названием Do query stuff here уже является асинхронной, зачем тогда помещать ее в диспетчерскую_очередь?

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

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

В конце концов, все зависит от того, какой запрос у вас есть и какие методы он предлагает вам для регистрации действия, которое будет выполнено после завершения загрузки.

person micantox    schedule 19.09.2013
comment
Насколько я знаю, блок запроса является асинхронным, не могли бы вы рассказать мне больше о реализации обратного вызова или блока для решения этой проблемы, потому что я очень новичок в Objective-C. Я только что отредактировал свой код для лучшего понимания. Я думаю, что не могу получить синхронный запрос, потому что он получен из API Parse.com. - person babygau; 19.09.2013