为什么我不能从我的块中返回一个对象?

时间:2011-12-08 19:49:33

标签: iphone objective-c cocoa-touch asynchronous nsmutablearray

我正在尝试从我的方法中的块中返回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 个答案:

答案 0 :(得分:4)

你期望返回一个物体做什么?据推测,您提交给ASIFormDataRequest的完成块被声明为void (^)()(或dispatch_block或其他一些评估为void (^)()的typedef。鉴于此,调用块的代码不期望返回值。这就像实现一个声明为- (void)foo的方法并尝试从中返回一个对象;它只是没有意义。

编辑:重新阅读您的代码后,我希望您真正想做的是从-getTodayData:返回一个值。但是,您正在执行异步请求。在块执行之前,方法-getTodayData:已经已经返回

答案 1 :(得分:4)

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];
}

答案 2 :(得分:1)

该块定义为void。想想你是如何尝试与块进行交互的。你想从街区回来的是什么?谁会回归?怎么样?

我认为你有一个误解就是处理异步编程。您的方法- (NSMutableArray*)getTodayData:(NSDate*)today实际上只发送请求返回一个数组。您发送请求,请求将在块完成后执行。但是当程序块执行时,您的程序将从getTodayData:方法返回。它将具有返回值。

您要做的是使用delegate。当在请求完成时执行块时,您可以通知代理该响应现在存储在某处 - 最好是作为实例变量 - 现在可以访问了。