在构造函数里调用 URLSession.shared.dataTask(), 在 dataTask()参数的闭包里给类成员赋值的问题?

2016-11-25 09:51:54 +08:00
 HannibaI

程序打开是一个 UITableView, 在 TableViewController 的 viewDidLoad()函数中构造类 Series 的对象并保存在外部数组中。

class SeriesTableViewController: UITableViewController {

    var seriesArray = [Series]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        loadSampleSeries()
    }
    
    func loadSampleSeries() {
        let photo1 = UIImage(named:"WestWorld")
        let name1 = "西部世界  WestWorld"
        let url1 = "http://www.zimuzu.tv/resource/index_json/rid/33701/channel/tv"
        let series1 = Series(name: name1, photo: photo1, zimuzuJsonUrl: url1)
        
        seriesArray.append(series1)
    }
    ... ...
}

Series 的构造函数会调用 URLSession.shared.dataTask(), 在 dataTask 的闭包中对返回的 data 进行解析然后赋值给类 Series 的成员。

class Series {

    var nextDate: String = ""
    var nextTime: Int = 0
    ...
    ...
    init( ... ... ) {
        let task = URLSession.shared.dataTask(with: request) {
            (data, response, error) -> Void in
            ...
            ...
             self.nextTime = ...
             self.nextDate = ...
            }
        }
        task.resume()
    }
    ...
    ...
}

但是发现 URLSession.shared.dataTask 并没有在构造函数中马上被执行,直到 UITableViewController 调用了 UITableViewDataSource 后才执行并对 Series 的对象赋值。导致 TableView 中无法显示正确的数据。

在控制台打印发现各个函数的执行顺序是这样的:

didFinishLaunchingWithOptions
viewDidLoad()
Series.init()
tableView() -> UITableViewCell
URLSession.shared.dataTask()

问题是:

4247 次点击
所在节点    iDev
4 条回复
HannibaI
2016-11-25 12:02:48 +08:00
好吧 不知道这个是不是答案

loveuqian
2016-11-25 12:14:50 +08:00
那是一个异步 block 吧

可能你需要在 block 里 reload 一下 table ?
HannibaI
2016-11-25 18:51:50 +08:00
@loveuqian 好吧。学了好几天第一次接触到 block 的概念。我还一直以为那是个闭包。谢谢!
dsmo
2016-11-30 16:31:31 +08:00
swift 里叫闭包, oc 里是 block

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/323151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX