Swift,URLSession,viewDidLoad,tableViewController

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift,URLSession,viewDidLoad,tableViewController相关的知识,希望对你有一定的参考价值。

我从没真正得到异步操作的细微差别,所以一次又一次,我受阻了。我只是想不通。

我正在尝试进行一些非常简单的Web抓取。

我的当地排球协会有一个页面(详细的html,不响应,不适合移动设备,yaddah,yaddah,yaddah),其中显示了分配给本赛季各场比赛的裁判。我正在尝试编写一个愚蠢的小应用程序,该应用程序将抓取该页面(没有API,不能直接访问db等),并在分组表中显示数据。第一组将显示今天的比赛(时间,主队,客队)。第二组将显示明天的比赛。第三组显示整个赛季的比赛。

[使用在其他地方找到的代码,我的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()
      }

    }
  }

以上是关于Swift,URLSession,viewDidLoad,tableViewController的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 URLSession 发送空请求

Swift 重复 URLSession 造成大量内存泄漏

迁移到 Swift3 的问题,URLSession.GET 的编译错误

如何在 Swift 中使用 URLSession 缓存图像

将 URLSession 更新为 swift 3 抛出错误

swift--使用URLSession异步加载图片