簡體   English   中英

為什么不能從塊中返回對象?

[英]Why can't I return an object from my block?

我正在嘗試從我的方法中的塊返回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];
}

您期望返回一個對象做什么? 假設您交給ASIFormDataRequest的完成塊被聲明為void (^)() (或dispatch_block或其他評估為void (^)() typedef)。 鑒於此,調用該塊的代碼不期望返回值。 就像實現一個聲明為- (void)foo並嘗試從中返回一個對象一樣; 只是沒有意義。

編輯:重新閱讀代碼后,我希望您真正想做的是從-getTodayData:返回一個值。 但是,您正在執行異步請求。 -getTodayData:方法在執行塊之前已經很久才返回

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

該塊定義為void 考慮一下您如何嘗試與模塊互動。 您想從街區返回什么? 它會返回給誰? 怎么樣?

我認為您遇到的一個誤解是處理異步編程。 您的方法- (NSMutableArray*)getTodayData:(NSDate*)today實際上僅發送請求 返回數組。 您發送請求,請求將在完成后執行該塊。 但是,在執行該塊時,您的程序已經從getTodayData:方法返回了。 沒有返回值。

您要做的是使用委托 當請求完成時執行該塊時,您可以通知委托人,響應現在已存儲在某個位置(最好是實例變量),現在可以訪問了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM