2016-06-25 29 views
0

私のiOSアプリケーションでは、forecast.io APIを使用して特定の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); 
} 

、それは予測データのいずれかを取得する前に、ヌルとして示しており、allofitをのためのNSLogを発射します。私は何が欠けていますか?

答えて

2

私は取得しています問題は、予測データを正確に、

うんを取得される前に、NSMutableArrayのを作成しようとしていることです。問題は単に、「非同期」が何を意味するのかを理解していないことです。 ネットワークには、時間がになり、すべてバックグラウンドで発生します。一方、メインコードは一時停止しません;すべてが即座に実行されます。

したがって、あなたのコードが書かれた順番になることはありません。 3つのすべてのgetDailyForcastForLatitudeが直ちに呼び出され、メソッド全体が終了します。次に、順番にゆっくりと、1つずつ、サーバがコールバックし、3つの完了ハンドラ(中括弧内のもの)が呼び出されます。

あなたが完了ハンドラが順番に呼ばれるようにしたい場合は、それに先立つgetDailyForcastForLatitudeコールの完了ハンドラにを行わなければ、各getDailyForcastForLatitudeコールを必要としています。または、完了ハンドラがいつどのような順序で返されるかは問題にならないようにコードを記述します。

+0

3つのメッセージがすべてサーバーに送られ、同時に戻ってくるので、後者の方がずっと高速です。 – gnasher729

関連する問題