簡體   English   中英

Swift、URLSession、viewDidLoad、tableViewController

[英]Swift, URLSession, viewDidLoad, tableViewController

我從來沒有真正得到異步操作的細微差別,因此一次又一次,我得到阻礙。 我就是想不通。

我正在嘗試做一些非常簡單的網絡抓取。

我當地的排球協會有一個頁面(詳細的 HTML,不響應,不適合移動設備,yaddah,yaddah,yaddah)顯示分配給本賽季每場比賽的裁判。 我正在嘗試編寫一個愚蠢的小應用程序,它將抓取該頁面(沒有 API,無法直接訪問數據庫等)並將數據顯示在分組表中。 第一組將顯示今天的比賽(時間、主隊、客隊)。 第二組將展示明天的比賽。 第三組顯示整個賽季的比賽。

使用我在別處找到的代碼,我的viewDidLoad加載頁面,抓取數據並將其解析為數組。 一旦我解析了數據,我就有了三個數組: todaytomorrowmatches ,都是[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()
}

我相信任何了解異步操作的人都不會感到驚訝,我的表是空的。 我已經檢查過,我看到數據在那里並且被正確解析,等等。但是我一生都無法弄清楚如何在我的表中獲取數據。 我現在擁有的方式是,當numberOfSectionsnumberOfRowsInSection被調用時,數據還沒有准備好。

我在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM