2017-02-09 11 views
0

APIコールからのデータをオブジェクトに追加しようとしています。私のforループはそれを追加していますが、私はAPIコール内でしか読むことができません。どうして?私はそれを理解できません。APIコール内でのみ読み込み可能な値

私はカスタム配列オブジェクトを持っている:

var locations: [Locations] = [] 

は、これは私のAPI呼び出しです:

Configuration().API_URL.get("test") { (error, data: [Response]?) in 
       for response in data!{ 
        self.locations.append(Locations(latitude: response.latitude)) 
       } 
       //If I print the print(locations) here, it prints 
     } 
//If I do the print(locations) here(outside of API call), it does print empty object 

私はそれを追加しなかった場合、私はAPI呼び出しの外の場所からの出力を得ることができないのはなぜ値は存在しますか?私はそれがいくつかのばかげた質問だと確信していますが、私の心は吹き飛ばされています

答えて

3

あなたは非同期に呼ばれるクロージャを使用しています。

これは、幅広い話題のビットだが、getへの呼び出しの後に中括弧で、基本的にすべてのもの、すなわち、このようなもの:

{ (error, data: [Response]?) in 
    for response in data! { 
     self.locations.append(Locations(latitude: response.latitude)) 
    } 
    //If I print the print(locations) here, it prints 
} 

はネットワーク呼び出しが終了した後を実行しますコードです。 get()メソッドに「クロージャ」または後で実行されるコードブロックを渡しています。

get()を呼び出した後すぐにコードが呼び出されることはないので、あなたのコードは次の行に続きます。ここで指摘したように、locationsは空です。

get()関数が終了したときにのみ、クロージャー内のコードが呼び出され、locationsに追加することができます。

詳細については、Swiftのクロージャと非同期コールを参照することをお勧めします。

+0

ああ..私は今それを完全に理解しています。それをクリアしていただきありがとうございます:)それは実際にはかなり明らかです:D –