Swift API URLSession 不会将字符串附加到我的本地字符串数组

Swift API URLSession will not append strings to my local string array

我构建了一个应用程序,它使用 URLsession 数据任务从 api 中提取食谱。然后它获取所有食谱名称并将它们存储在一个字符串数组中。没有嵌套,只有配方名称。我有一个自定义函数来实现这一点。当我调用所述函数时,它会完美地附加到我的全局数组中,但是当 URLSession 数据任务完成时,该数组会恢复原状并显示为未触及。我该如何防止这种情况发生?

这是我声明变量的方式

class RecipesVCTableViewController: UITableViewController {
    
    var testArray=[String]()
    
    @IBOutlet var TV: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // where the problem is taking place
        testXcode()
        
        // refresh and reload table view cells
        TV.reloadData()
        
        //for debugging/breakpoints
        print()
    }

这是我的自定义 api 拉函数,它试图附加到 testArray:[String]

func testXcode(){
        
        let apiURL = URL(string: "https://api.edamam.com/search?q=mexican&app_id=MYID&app_key=MYAPIKEY")!
        
        let session = URLSession.shared.dataTask(with: apiURL) { (data, response, error) in
            let top = try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String:Any]
            
            let middle = top["hits"] as? [[String:Any]]
            
            for each in middle!{
                
                // try to append string to string array using hardcode for now
                self.testArray.append("Hard code test string.")
                    
                self.TV.reloadData()
            }
            
        }
        
        session.resume()
    }

出于安全原因,我删除了我的 apiKey/ID。它仍在我的应用程序中。

如果您在 viewDidLoad() 函数中检查 print() 的值,那么 testArray 将是相同的,因为 dataTaskcompletionHandler 尚未叫了。您应该检查 completionHandler 中的值,如下所示。

class RecipesVCTableViewController: UITableViewController {

var testArray=[String]()

@IBOutlet var TV: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    
    // where the problem is taking place
    testXcode()
    
}

func testXcode() {
    let apiURL = URL(string: "https://api.edamam.com/search?q=mexican&app_id=MYID&app_key=MYAPIKEY")!
    let session = URLSession.shared.dataTask(with: apiURL) { (data, response, error) in
        let top = try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String:Any]
        
        let middle = top["hits"] as? [[String:Any]]
        
        for each in middle!{
            // try to append string to string array using hardcode for now
            self.testArray.append("Hard code test string.")
        }
        self.TV.reloadData()
        
        // Check it from here
        print()
    }
    
    session.resume()
}

}