在调用下一个方法之前代码未完成

时间:2016-06-25 04:39:38

标签: ios objective-c nsmutablearray completionhandler

在我的iOS应用中,我使用forecast.io API获取3个特定日期的天气预报。一旦我从所有3个数组中获取数组,我想创建一个NSMutableArray并将所有这些对象添加到它。我得到的问题是它在检索预测数据之前尝试创建NSMutableArray。以下是我到目前为止的情况:

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。我错过了什么?

1 个答案:

答案 0 :(得分:2)

  

我得到的问题是它在检索预测数据之前尝试创建NSMutableArray

是的,确切地说。问题只是你不明白"异步"手段。 网络需要时间,这一切都发生在后台。同时,您的主要代码不会暂停;它全部立即执行。

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

如果您希望按顺序调用完成处理程序,则需要在其前面的getDailyForcastForLatitude调用的完成处理程序中进行每次getDailyForcastForLatitude调用。或者,编写代码的方式使得完成处理程序何时以及以何种顺序返回给您并不重要。