2016-09-08 2 views
-1

Я создал функцию блокировки блока, использующую библиотеку AFNetworking. Эта функция используется для запроса GET и используется так.блок ожидания iOS до завершения

[Mics getRequestBLOCK:clientsUrlStr BlockRequest:^(NSString *response) { 
    //use response here 
}]; 

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

+ (NSArray*)OnlineClients 
{ 
    NSString *clientsUrlStr = [NSString stringWithFormat:@"%@/sinch/clients", ROOT_URL]; 
    __block NSArray *clients = [[NSArray alloc] init]; 
    [Mics getRequestBLOCK:clientsUrlStr BlockRequest:^(NSString *response) { 
     clients = [response componentsSeparatedByString: @","]; 
    }]; 

    return clients; 
} 

OnlineClients функция массива всегда возвращает 0 элемент, потому что блок запроса не закончена с завершением.

Итак, как я могу ждать завершения блока, чтобы получить ответный запрос для возврата в функцию?

Я искал различные темы в StackOverflow и google, но не нашел решения.

Пожалуйста, помогите.

+1

Тогда вы не очень хорошо искали. Это, вероятно, наиболее часто задаваемый и ответный вопрос во всех программах iOS для переполнения стека. – matt

+0

Возможный дубликат [iOS: Ожидание завершения блока API и возврат результата] (http://stackoverflow.com/questions/23507331/ios-waiting-for-api-completion-block-and-returning-the-result) – HAS

+0

http://stackoverflow.com/a/23507361/1489885 – HAS

ответ

1

Существует несколько возможностей решить вашу проблему. Вы можете либо использовать dispatch_group, либо dispatch_semaphore, чтобы дождаться ответа от асинхронного вызова до возвращаемого значения или изменить свой метод, чтобы иметь блок для ответа на ответ. Пожалуйста, ознакомьтесь с кодами ниже. Чтобы быть ИЗВЕЩЕНЫ, что dispatch_group и dispatch_semaphore собираются заблокировать текущий поток, чтобы ждать, пока другой не вызовет сигнал, поэтому не следует использовать его в основном потоке. На мой взгляд, я бы предложил 3-е решение. Надеюсь, это поможет вам.

//1 
+ (NSArray*)OnlineClients 
{ 
    dispatch_group_t serviceGroup = dispatch_group_create(); 

    NSString *clientsUrlStr = [NSString stringWithFormat:@"%@/sinch/clients", ROOT_URL]; 
    __block NSArray *clients = [[NSArray alloc] init]; 
    [Mics getRequestBLOCK:clientsUrlStr BlockRequest:^(NSString *response) { 
     clients = [response componentsSeparatedByString: @","]; 
     dispatch_group_leave(serviceGroup); 
    }]; 

    dispatch_group_enter(serviceGroup); 

    return clients; 
} 

//2 
+ (NSArray*)OnlineClients 
{ 
    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

    NSString *clientsUrlStr = [NSString stringWithFormat:@"%@/sinch/clients", ROOT_URL]; 
    __block NSArray *clients = [[NSArray alloc] init]; 
    [Mics getRequestBLOCK:clientsUrlStr BlockRequest:^(NSString *response) { 
     clients = [response componentsSeparatedByString: @","]; 
     dispatch_semaphore_signal(sema); 
    }]; 

    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

    return clients; 
} 

//3 
+ (void)getOnlineClientsWithCompletionBlock:(void (^) (NSArray *clients))completionBlock 
{ 
    NSString *clientsUrlStr = [NSString stringWithFormat:@"%@/sinch/clients", ROOT_URL]; 
    __block NSArray *clients = [[NSArray alloc] init]; 
    [Mics getRequestBLOCK:clientsUrlStr BlockRequest:^(NSString *response) { 
     clients = [response componentsSeparatedByString: @","]; 
     if (completionBlock) { 
      completionBlock(clients); 
     } 
    }]; 

} 
+0

1 и 2 собираются заблокировать нить вправо, что если в основном потоке будет блокировано любое взаимодействие пользовательского интерфейса. Может быть полезно упомянуть об этом. – sbarow

+0

@sbarow точно. Спасибо за ваш вопрос, следует быть осторожным с точки зрения блокировки потоков. – HDT

+0

Во-первых, спасибо за помощь. Решение 1: я не вижу, что это что-то ждет, массив все еще возвращает '0 элементов', честно говоря, я пробовал это раньше, но это не сработает. Решение 2. Когда я применяю этот код, как я это делал раньше, это ждет всегда и никогда не возвращается. – vietnguyen09

Смежные вопросы