代码之家  ›  专栏  ›  技术社区  ›  Keithers

有没有办法在另一个范围内使用我的类型音乐阵列?

  •  0
  • Keithers  · 技术社区  · 6 年前

    我正试图在创建音乐的函数之外打印/转储和排列类型音乐。我可以成功地将musicitems数组转储到getmusicdata函数中,但是当我将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)
    
    ...
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Dan Karbayev    6 年前

    “getmusicdata”函数是异步的,这意味着当它执行时,它会在后台队列中对数据任务进行排队并继续执行,由于没有更多的机构,它只会将控制权返回到调用站点-“musicbutton()”操作,它依次执行下一条指令-打印“musicitems”数组,由于网络调用尚未完成,该数组可能(而且很可能)尚未填充。这里的一个选项是将一个完成块传递给“getmusicdata”函数,该函数在数据任务获得结果后运行。

        2
  •  1
  •   Popmedic    6 年前

    另一种选择是 Property Observers

    var musicItems: [Music] = [] {
        didSet {
            dump(self.musicItems)
    /// This is where I would do the...
    //            DispatchQueue.main.async {
    //                self.tableView.reloadData()
    //            }
        }
    }
    

    然后

    func getMusicData() {
        guard let searchTerm = searchString else { print("no search"); 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 { print("url error"); return }
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else { print(err ?? "unknown"); return }
            do {
                let music = try JSONDecoder().decode(MusicResults.self, from: data)
                if let results = music.results {
                    self.musicItems.append(contentsOf: results)
                }
            } catch let jsonErr {
                print("Error serializing json:", jsonErr)
            }
        }.resume()
    }