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
将是相同的,因为 dataTask
的 completionHandler
尚未叫了。您应该检查 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()
}
}
我构建了一个应用程序,它使用 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
将是相同的,因为 dataTask
的 completionHandler
尚未叫了。您应该检查 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()
}
}