程序打开是一个 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()
问题是:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.