swift - 有没有办法在另一个范围内使用我的音乐类型数组?

标签 swift

我正在尝试在创建它的函数之外打印/转储和类型为 Music 的数组。我可以成功地将 musicItems 数组转储到 getMusicData 函数内,但是当我将 musicItems 数组设置在范围之外时,它赢了'打印任何东西。我在这里的范围有什么问题?我觉得它非常简单,但我就是想不通。预先感谢您花时间阅读本文。

编辑:当我尝试将 musicItems 数组转储到 ViewController 类中时,控制台中显示“0 个元素”。好吧,该函数也在同一个类中,所以我想我不知道如何调用第一个数组。父数组?<​​/p>

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()” Action ,它依次执行下一条指令 - 打印“musicItems”数组,由于网络调用尚未完成,该数组可能(而且很可能是)仍未填充。您在此处拥有的选项之一是将完成 block 传递给“getMusicData”函数,该函数在数据任务获得结果后运行它。

关于swift - 有没有办法在另一个范围内使用我的音乐类型数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275479/

相关文章:

ios - 使用 WKWebView 拉动刷新

swift - 在 Swift 的另一个 UIView 中使用一个 UIView 作为掩码

ios - estimatedHeightForRowAtIndexPath 最佳实践

swift - 想知道这是否是执行此操作的最佳方式。 tableview 切换单元格大小

ios - 如何让 UIBarButtonItem 打开一个新的 View Controller swift 3

macos - Swift 中的 OS X 应用程序 View 管理

swift - 如何在 AppDelegate 和 ViewController 之间共享属性,并在 App 终止之前保存

swift - 从 Sonos 回调 URL 将实时 json 数据发送到 Swift IOS 应用程序以订阅事件

ios - 从 Nib 文件移动后如何显示 UITabBarController

ios - SwiftyStoreKit解析收据