Почему я не могу вернуть объект из моего блока? - PullRequest
1 голос
/ 08 декабря 2011

Я пытаюсь вернуть NSMutableArray из моего блока в моем методе, но когда я добавляю строку return [responseString JSONValue];, я получаю некоторые предупреждения компилятора.

- (NSMutableArray*)getTodayData:(NSDate*)today
{
        ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
        [request setPostValue:[dateFormat stringFromDate:today] forKey:@"target_date"];
        NSError *error = [request error];

        [request setCompletionBlock:^{
            NSString *responseString;
            if (!error) {
                responseString = [request responseString];
                return [responseString JSONValue];
            } else {
                NSLog(@"error: %@", error);
            }
        }];
        [request setFailedBlock:^{
            NSString *responseString;
            if (!error) {
                responseString = [request responseString];
            } else {
                NSLog(@"error: %@", error);
            }
        }];
        [request startAsynchronous];
}

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Методы setCompletionBlock: и setFailedBlock: в ASIFormDataRequest не принимают блоки с возвращаемым значением.Вы должны реструктурировать свой код так, чтобы не было возвращаемого значения.

Например:

- (void)viewDidLoad
{
  [self getTodayData:self.datePicker.date];
}

- (void)getTodayData:(NSDate*)today
{
      self.appointmentsArray = [NSArray array]; // set it to an empty value now, so the table view displays nothing

      ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
      [request setPostValue:[dateFormat stringFromDate:today] forKey:@"target_date"];
      NSError *error = [request error];

      [request setCompletionBlock:^{
          NSString *responseString;
          if (!error) {
              responseString = [request responseString];
              self.appointmentsArray = [responseString JSONValue];

              [self.appointmentsArrayTableView reloadData]; // I'm assuming you want to display the appointments in some view
          } else {
              NSLog(@"error: %@", error);
          }
      }];
      [request setFailedBlock:^{
          NSString *responseString;
          if (!error) {
              responseString = [request responseString];
          } else {
              NSLog(@"error: %@", error);
          }
      }];
      [request startAsynchronous];
}
4 голосов
/ 08 декабря 2011

Что вы ожидаете от объекта? Предположительно, блок завершения, который вы передаете ASIFormDataRequest, объявляется как void (^)() (или dispatch_block или как-то другой typedef, значение которого равно void (^)()) Учитывая это, код, вызывающий блок, не ожидает возвращаемого значения. Это было бы как реализация метода, объявленного - (void)foo, и попытка вернуть объект из этого; это просто не имеет смысла.

Редактировать: После перечитывания вашего кода я ожидаю, что вы действительно пытаетесь вернуть значение из -getTodayData:. Однако вы выполняете асинхронный запрос. Метод -getTodayData: уже уже вернул задолго до выполнения вашего блока.

1 голос
/ 09 декабря 2011

Блок определен как void. Подумайте, как вы пытаетесь взаимодействовать с блоком. Что вы пытаетесь вернуть из блока? К кому это вернется? Как?

Я думаю, что одно недоразумение, которое вы испытываете, касается асинхронного программирования. Ваш метод - (NSMutableArray*)getTodayData:(NSDate*)today на самом деле только отправляет запрос . не возвращает массив. Вы отправляете запрос, и запрос выполнит блок после его завершения. Но ваша программа уже вернется из вашего getTodayData: метода к тому времени, когда будет выполнен блок. Он будет иметь нет возвращаемого значения.

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

...