swift - 有没有办法在另一个范围内使用我的音乐类型数组?
问题描述
我正在尝试在创建它的函数之外打印/转储音乐类型的数组。我可以成功地在 getMusicData 函数内转储 musicItems 数组,但是当我将 musicItems 数组设置在范围之外时,它不会打印任何事物。我在这里的范围做错了什么?我有一种感觉,它超级简单,但我就是想不通。提前感谢您花时间阅读本文。
编辑:当我尝试在 ViewController 类中转储 musicItems 数组时,它在控制台中给了我“0 个元素”。好吧,该函数也在同一个类中,所以我想我不知道如何调用第一个数组。父数组?
struct MusicResults: Decodable {
let results: [Music]?
}
struct Music: Decodable {
let trackName: String?
let collectionName: String?
let artworkUrl30: String?
}
class ViewController: UITableViewController, UISearchBarDelegate {
var musicItems: [Music] = []
@IBAction func musicButton(_ sender: UIBarButtonItem) {
getMusicData()
dump(musicItems)
}
这是功能。
func getMusicData() {
var musicItems: [Music] = []
guard let searchTerm = searchString else {return}
let newString = searchTerm.replacingOccurrences(of: " ", with: "+", options: .literal, range: nil)
let jsonUrlString = "https://itunes.apple.com/search?media=music&term=\(newString)"
guard let url = URL(string: jsonUrlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
let music = try JSONDecoder().decode(MusicResults.self, from: data)
for results in music.results! {
// print(results.trackName!)
musicItems.append(results)
}
//dump(musicItems)
self.musicItems = musicItems
// DispatchQueue.main.async {
// self.tableView.reloadData()
// }
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}.resume()
}
固定代码
@IBAction func musicButton(_ sender: UIBarButtonItem) {
getMusicData {
music in
dump(music)
}
功能:
func getMusicData(completionHandler: @escaping (_ music: [Music]) -> ()) {
...
let music = try JSONDecoder().decode(MusicResults.self, from: data)
for results in music.results! {
musicItems.append(results)
}
completionHandler(musicItems)
...
解决方案
您的“getMusicData”函数是异步的,这意味着当它执行时,它将数据任务排入后台队列并继续执行,并且由于没有更多机构,它只是将控制权返回给其调用站点-“musicButton()”操作,轮流执行下一条指令 - 打印可能(并且很可能)仍未填充的“musicItems”数组,因为网络调用尚未完成。您在此处拥有的选项之一是将完成块传递给您的“getMusicData”函数,该函数在数据任务获得结果后运行它。
推荐阅读
- sql - 将列中的值分隔到 SSMS 中的不同段或列
- c# - 为什么创建令牌时会创建错误
- azure - Azure 日志,找不到
- javascript - 使用 python 烧瓶的异步服务器消息
- erpnext - 如何将数据传递给另一个文档类型
- node.js - 具有大图像尺寸的 Base64 图像上的 Nodejs CORS 错误
- directx-9 - 为什么在以 ps_4_0 为目标时不支持 COLOR 作为输出语义,但在 vs_4_0 中支持?
- javaparser - JavaParser 中 VoidVisitorAdapter 和 GenericVisitorAdapter 的功能区别是什么
- mysql - SQL 将某些数据从一个表插入到另一个表
- blockchain - 一旦用户提供节点数量和配置详细信息,如何创建新的 Corda 网络?