Мой вопрос очень похож на несколько других here, но я просто не могу заставить его работать. Я делаю вызов API через класс-помощник, который я написал.Захват значений закрытия в Swift
Сначала я попробовал стандартную функцию с возвращаемым значением, и результат был таким, как ожидалось. Фоновая задача выполнена после того, как я устал назначать результат.
Теперь я использую закрытие, и я могу вернуть значение в контроллер своего вида, но его все еще застрял в закрытии, у меня такая же проблема. Я знаю, что мне нужно использовать GCD, чтобы получить назначение в главной очереди.
это то, что у меня в контроллере
var artists = [String]()
let api = APIController()
api.getArtistList("foo fighters") { (thelist) -> Void in
if let names = thelist {
dispatch_async(dispatch_get_main_queue()) {
artists = names
print("in the closure: \(artists)")
}
}
}
print ("method 1 results: \(artists)")
зрения как результаты:
method 1 results: []
in the closure: [Foo Fighters & Brian May, UK Foo Fighters, John Fogerty with Foo Fighters, Foo Fighters, Foo Fighters feat. Norah Jones, Foo Fighters feat. Brian May, Foo Fighters vs. Beastie Boys]
Я знаю, почему это происходит, я просто не знаю, как это исправить: (API-вызовы должны быть асинхронными, поэтому какова наилучшая практика для сбора этих результатов? Основываясь на том, что пользователь выбирает в виде таблицы, я буду делать последующие вызовы api, так что это не так, как я могу обрабатывать все внутри закрытия
Это прекрасно работает. Представление сначала загружается пустой таблицей, а затем заполняется. – rjb101
Без проблем Роберт. Я настоятельно рекомендую вложить несколько минут в https://github.com/jdg/MBProgressHUD. Я не автор, но это моя плавная рамка для опускания в накладке быстрой загрузки, ожидая появления данных. Если у пользователя нет сетевого подключения, они могут задаться вопросом - он все еще думает? –