如何在 Swift 中等待异步函数?

时间:2021-01-26 19:22:55

标签: ios swift

我来自 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
    }
}

1 个答案:

答案 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)
}