我来自 JavaScript/Flutter 环境,我需要在 Swift 中等待异步函数。有办法吗?
基本上,我想从类中返回 repoNames,但“任务”的执行速度比 return 关键字快。
代码如下:
import UIKit
class SearchViewModel {
let textFieldText: String?
var repoNames: Array<String> = []
init(textFieldText: String?) {
self.textFieldText = textFieldText
}
func searchForRepo() -> Array<String> {
let baseUrl = "https://api.github.com/search/repositories?q="
let finalUrl = URL(string: baseUrl + self.textFieldText!)
let session = URLSession.shared
let task = session.dataTask(with: finalUrl!) { (data, response, error) in
guard let data = data else { return }
let repos: Items = try! JSONDecoder().decode(Items.self, from: data)
for repo in repos.items {
self.repoNames.append(repo.name)
print(self.repoNames)
}
}
task.resume()
return self.repoNames
}
}
答案 0 :(得分:1)
添加完成
func searchForRepo(completion:@escaping( [String] -> ())) -> {
let baseUrl = "https://api.github.com/search/repositories?q="
let finalUrl = URL(string: baseUrl + self.textFieldText!)
URLSession.shared.dataTask(with: finalUrl!) { (data, response, error) in
guard let data = data else { return }
do {
let repos = try JSONDecoder().decode(Items.self, from: data)
self.repoNames = repos.items.map { $0repo.name }
completion(self.repoNames)
}
catch {
print(error)
}
}.resume()
}
打电话时
SearchViewModel(textFieldText:"someValue").searchForRepo { res in
print(res)
}