2013-10-15 6 views
0

пытается отправить следующее сообщениеAPI блок сообщений об ошибках

- (NSArray *)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count 
{ 
    [api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) { 
     if (!error) { 
      return [NSArray arrayWithArray:[[output toDictionary] valueForKey:@"items"]]; 
     } else { 
      NSLog(@"ERROR IN CallApi, %@", &error); 
     } 
    }]; 
    return nil; 
}

я получаю следующие ошибки:

Incompatible block pointer types

Control may reach end of non-void block

блок от класса Апи, и я хотел бы создать метод, поскольку он используется несколько раз в одном контроллере. Что удерживает код от возможности вернуть вложенное значение NSArray?

+1

Почему метод 'callSwaggerwithStart ...' имеет возвращаемого значения? Это бессмысленно при работе с асинхронным блоком, который не будет возвращать данные до тех пор, пока метод не вернется. Вам нужно переосмыслить, как это работает. – rmaddy

+0

Я добавил возвращаемое значение, тогда оно будет удалено. Благодаря! – aug2uag

ответ

1

Блок завершения API выполняется асинхронно, поэтому вы не можете синхронно возвращать все, что он вычисляет вызывающему абоненту callSwaggerWithStart.... Завершение Handler скорее всего будет выполнено намного позже, чем метод вернется.

Действительный подход был бы также сделать callSwaggerWithStart... асинхронно следующим образом:

- (void)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count completionHandler:(void (^)(NSArray *result, NSError *error))completionHandler 
{ 
    [api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) { 
     if (completionHandler) { 
      if (!error) { 
       completionHandler([output toDictionary][@"items"]], error); 
      } else { 
       completionHandler(nil, error); 
      } 
     } 
    }]; 
} 
+1

+1 Awesome @GP, и приятно видеть, что этот шаблон обрабатывает блоки для блоков – aug2uag

1

Метод -messageWithCompletionBlock:etc: выглядит как асинхронный, что означает, что, как он в настоящее время написан, блок будет вызван после того, как возвращается -callSwaggerEtc:. «Возврат» внутри блока возвращается из блока, а не из самого метода. У вас есть два варианта: измените -callSwaggerEtc: на собственный обработчик завершения или используйте semaphore, чтобы сделать его синхронным и ждать, пока он не будет вызван ,

+0

Ооф, какая ошибка, что возвращение – aug2uag

0

start является NSNumber, а не блоком. Или messageWithCompletionBlock: действительно плохо назван ...

completionHandler не ожидает возврата. Это также блок, поэтому возвращение оттуда просто выходит из блока, а не из содержащего метода.

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

+0

Я сильно подозреваю, что это плохо названо. –

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