Получить возвращаемое значение в ASIBasicBlock - PullRequest
0 голосов
/ 23 июля 2011

У меня есть контроллер представления, который сделает запрос к серверу.Я поместил все обработчики запросов к серверу в один класс.Поэтому в контроллере представления просто используйте [Apihandler getlist], чтобы получить список, например.

В классе Apihandler я использовал блок в

[_request setCompletionBlock:^{}]

для получения ответа сервера (объект JSON).

Если объект JSON содержит ключ / значение с именем «error», я буду воспринимать его как сбой, хотя он завершен для самого ASIHttpRequest.В противном случае это успех.

Вопрос: как мне получить возвращаемое значение вышеупомянутого блока завершения?Я проверил документ ASI, ASIBasicBlock имеет тип возврата void.

1 Ответ

2 голосов
/ 20 апреля 2012

Я сделал это с делегатом. Итак, у меня есть код, который выглядит так:

[request setCompletionBlock:^{
    NSLog(@"Data retrieved");
    NSData *data = [request responseData];
    NSLog(@"Status Code: %d", [request responseStatusCode]);
    dispatch_async(backgroundQueue, ^(void){
        [self processData:data];
    });
}];

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

- (void)processData:(NSData *)data {

    NSError *error = nil;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];


    dispatch_async(dispatch_get_main_queue(), ^(void){
        [self.delegate requestDataReady:json];
    });
}

Надеюсь, это поможет.

UPDATE:

Конечно, вам не нужно запускать метод процесса в фоновом потоке. Вы можете также легко вызвать [self processData: data] внутри блока или даже поместить код из processData внутри блока.

...