[英]Swift: Calling ViewDidLoad recursively due to URLSession.DataTask
[英]Swift, URLSession, viewDidLoad, tableViewController
我從來沒有真正得到異步操作的細微差別,因此一次又一次,我得到阻礙。 我就是想不通。
我正在嘗試做一些非常簡單的網絡抓取。
我當地的排球協會有一個頁面(詳細的 HTML,不響應,不適合移動設備,yaddah,yaddah,yaddah)顯示分配給本賽季每場比賽的裁判。 我正在嘗試編寫一個愚蠢的小應用程序,它將抓取該頁面(沒有 API,無法直接訪問數據庫等)並將數據顯示在分組表中。 第一組將顯示今天的比賽(時間、主隊、客隊)。 第二組將展示明天的比賽。 第三組顯示整個賽季的比賽。
使用我在別處找到的代碼,我的viewDidLoad
加載頁面,抓取數據並將其解析為數組。 一旦我解析了數據,我就有了三個數組: today
、 tomorrow
和matches
,都是[Match]
。
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: urlString)!
let request = NSMutableURLRequest(url: url)
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, response, error in
if let error = error {
print (error)
} else {
if let unwrappedData = data {
// scrape, scrape, parse, parse
matchRow = ...
self.matches.append(matchRow)
if matchRow.date == todaysDate {
self.today.append(matchRow)
} else if matchRow.date == tomorrowsDate {
self.tomorrow.append(matchRow)
}
}
}
}
task.resume()
}
我相信任何了解異步操作的人都不會感到驚訝,我的表是空的。 我已經檢查過,我看到數據在那里並且被正確解析,等等。但是我一生都無法弄清楚如何在我的表中獲取數據。 我現在擁有的方式是,當numberOfSections
或numberOfRowsInSection
被調用時,數據還沒有准備好。
我在 URLSession 上找到了 Ray Wenderlich 教程,我還有一個 Udemy 課程(Rob Percival),它構建了一個應用程序來使用網絡抓取來獲取天氣,但在這兩種情況下,應用程序都會啟動並在出去之前等待用戶輸入到網絡獲取數據。 我希望我的應用程序在啟動時立即獲取數據,無需用戶交互。 但我就是不知道我需要做哪些更改,以便這些示例適用於我的程序。
請幫忙。
一旦從 URLSession 完成塊填充數據數組,您就可以簡單地重新加載表視圖。 你有沒有試過。 示例片段可能如下所示。
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, response, error in
if let error = error {
print (error)
} else {
if let unwrappedData = data {
// scrape, scrape, parse, parse
matchRow = ...
self.matches.append(matchRow)
if matchRow.date == todaysDate {
self.today.append(matchRow)
} else if matchRow.date == tomorrowsDate {
self.tomorrow.append(matchRow)
}
}
DispatchQueue.main.async { [weak self] in
self?.todayTableView.reloadData()
self?.tomorrowTableView.reloadData()
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.