在下一个方法被调用之前,代码没有完成

在我的iOS应用程序中,我使用forecast.io API获取了3天的天气预报。 一旦我从所有3中获得数组,我想创build一个NSMutableArray并将所有这些对象添加到它。 我得到的问题是它试图在预测数据被检索之前创buildNSMutableArray。 这是我到目前为止:

typedef void(^myCompletion)(BOOL); -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; [self myMethod:^(BOOL finished) { if(finished){ NSMutableArray *allOfIt = [[NSMutableArray alloc] initWithObjects:self.weatherSaturday, self.weatherSunday, self.weatherMonday, nil]; NSLog(@"%@", allOfIt); } }]; } -(void) myMethod:(myCompletion) compblock{ //do stuff ForecastKit *forecast = [[ForecastKit alloc] initWithAPIKey:@"MY-API-KEY"]; // Request the forecast for a location at a specified time [forecast getDailyForcastForLatitude:37.438905 longitude:-106.886051 time:1467475200 success:^(NSArray *saturday) { // NSLog(@"%@", saturday); self.weatherSaturday = saturday; } failure:^(NSError *error){ NSLog(@"Daily w/ time %@", error.description); }]; [forecast getDailyForcastForLatitude:37.438905 longitude:-106.886051 time:1467561600 success:^(NSArray *sunday) { // NSLog(@"%@", sunday); self.weatherSunday = sunday; } failure:^(NSError *error){ NSLog(@"Daily w/ time %@", error.description); }]; [forecast getDailyForcastForLatitude:37.438905 longitude:-106.886051 time:1467648000 success:^(NSArray *monday) { // NSLog(@"%@", monday); self.weatherMonday = monday; } failure:^(NSError *error){ NSLog(@"Daily w/ time %@", error.description); }]; compblock(YES); } 

当代码运行时,它会触发NSLog for allOfIt,显示为null,然后获取任何预测数据。 我错过了什么?

我得到的问题是它试图在预测数据被检索之前创buildNSMutableArray

是的,正好。 问题很简单,你不明白“asynchronous”的含义。 networking需要时间 ,这一切都发生在后台。 同时,你的主代码不会暂停 ; 它全部立即执行。

因此,事情不会按照您的代码编写的顺序发生。 所有三个getDailyForcastForLatitude调用立即触发,整个方法结束。 然后,慢慢地,一个一个的,没有特别的顺序,服务器callback,三个完成处理程序(花括号中的东西)被调用。

如果getDailyForcastForLatitude调用完成处理程序 ,则需要在其之前的getDailyForcastForLatitude调用的完成处理程序中进行每个getDailyForcastForLatitude调用。 或者,编写代码的方式是,完成处理程序返回给您的时间和顺序无关紧要。