@Bookin

Objective c, как дождаться окончания работы блока?

Есть функция которая должна вернуть массив либо из файла, либо скачать с сервера и положить в этот файл. Прошу эту функцию вернуть массив, она возвращает пустой, а после уже выполняет запрос на сервер, как вернуть данные после загрузки с сервера?
Примерно вот что имею:
-(NSArray*)getData{
  __block NSArray *returnData = nil;
  if([self internetConnect]){
     [self reloadData:^(NSArray* loadData){
       returnData = loadData;
     }];
  }else{
     //тут проблем нет
  }
  return returnData;
}

В методе reload data так же есть блок, который загружает данные, в общем маюсь как этот блок с блоком, которая все в купе загружают данные и ложат в массив, вернуть из этого метода getData, после того как все прогрузилось.
Заранее благодарен за помощь.
  • Вопрос задан
  • 2921 просмотр
Решения вопроса 1
ivladiboy
@ivladiboy
Нужно, чтобы текущий поток дождался завершения асинхронного запроса.

-(NSArray*)getData{
    __block NSArray *returnData = nil;
    if([self internetConnect]){
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void){
            [self reloadData:^(NSArray* loadData){
                returnData = loadData;
            }];
        });
    }else{
        
    }
    return returnData;
}

Можно также завести свою собственную конкурентную очередь

+(dispatch_queue_t)sharedConcurrentQueue {
    static dispatch_queue_t queue = nil;
    static dispatch_once_t onceToken = 0;
    
    dispatch_once(&onceToken, ^{
        queue = dispatch_queue_create("MyQueueName", DISPATCH_QUEUE_CONCURRENT);
    });

    return queue;
}

И помещать в нее любые задачи таким образом

-(void)testFunc {
    dispatch_async([MyClass sharedConcurrentQueue], ^(void){
        // Все, что хотим запустить и идти дальше, не дожидаясь
    });
    
    dispatch_sync([MyClass sharedConcurrentQueue], ^(void){
        // Все, что хотим запустить и подождать завершения
    });
}

Почитать об этом можно тут.
Или гуглить "Grand Central Dispatch".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы