完成块完成后返回一个数组

时间:2014-01-06 10:19:13

标签: ios iphone objective-c objective-c-blocks

我有以下功能

- (NSArray*) calendarMonthView:(TKCalendarMonthView*)monthView marksFromDate:(NSDate*)startDate toDate:(NSDate*)lastDate{
    AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
    _currentStart = startDate;
    _currentEnd = lastDate;

    if(appDelegate.internetActive){
        Webservice *web = [[Webservice alloc]init];
        [web fetchAppointmentsOnCompletionFor:startDate andEnd:lastDate OnCompletion:^(BOOL finished) {
            if(finished){
                [self generateRandomDataForStartDate:startDate endDate:lastDate];
                 // NOW return the self.dataArray
            }
        }];
    }
    return self.dataArray; 
}

我无法弄清楚self.dataArray完成后如何返回completionblock。因为我的self.dataArray填写在方法generateRandomDataForStartDate:startDate中。所以此时函数总是返回一个空数组。

先谢谢

2 个答案:

答案 0 :(得分:3)

您应该在参数内传递完成处理程序块。将返回类型设为void

调用者对象将写在代码下面:

[calenderView calendarMonthView:monthView marksFromDate:startDate toDate:lastDate completionHandler:^(NSarray *dataArray){
//Process data array over here
}];

- (void) calendarMonthView:(TKCalendarMonthView*)monthView marksFromDate:(NSDate*)startDate toDate:(NSDate*)lastDate completionHandler:(void (^)(NSArray*))completionBlock{
    AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
    _currentStart = startDate;
    _currentEnd = lastDate;

    if(appDelegate.internetActive){
        Webservice *web = [[Webservice alloc]init];
        [web fetchAppointmentsOnCompletionFor:startDate andEnd:lastDate OnCompletion:^(BOOL finished) {
            if(finished){
                [self generateRandomDataForStartDate:startDate endDate:lastDate];
                 completionBlock(self.dataArray);
            }
        }];
    }
    completionBlock(self.dataArray);
}

在调用者代码句柄完成块中,响应数组作为argumnet接收。

答案 1 :(得分:1)

您不需要从此方法返回数组,正如您所提到的那样,您的dataArray正在generateRandomDataForStartDate:startDate方法下填充,因此您可以从该方法处理填充的数组,因此您的代码将是,

    - (void) calendarMonthView:(TKCalendarMonthView*)monthView marksFromDate:(NSDate*)startDate toDate:(NSDate*)lastDate{
    AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
   _currentStart = startDate;
   _currentEnd = lastDate;

   if(appDelegate.internetActive){
    Webservice *web = [[Webservice alloc]init];
    [web fetchAppointmentsOnCompletionFor:startDate andEnd:lastDate OnCompletion:^(BOOL finished) {
        if(finished){
            [self generateRandomDataForStartDate:startDate endDate:lastDate];
             // NOW return the self.dataArray
        }
    }];
}
}

填充数组的方法应返回修改后的数组

    -(NSArray *)generateRandomDataForStartDate:(NSString *)startDate endDate:(NSString *)endDate {
    // Your code here to populate and filling array
      return self.dataArray;
    }