繁体   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