2017-02-09 2 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 –

Смежные вопросы