代码之家  ›  专栏  ›  技术社区  ›  Jim H.

如何使用具有urlsession的函数更新TableViewCell?敏捷的

  •  0
  • Jim H.  · 技术社区  · 7 年前

    我有一个函数,可以获取位置坐标并获取天气数据。此函数用于代码中的其他位置。

    class Data {
        static func weather (_ coord:String, completion: @escaping...([String?]) -> (){
    
            let url = URL(string: "https://")
    
            let task = URLSession.shared.dataTask(with: url!) { data, response, error in
    
            let json = processData(data) //returns [String]?
    
            completion(json)
            }
            task.resume()
    
    
        }
    
        static func processData(_ data: Data) -> [String]? {
    
        }
    }
    

    在cellForRowAt中,如何在返回单元格之前修改天气函数以获取此处的值,但完成天气函数的原始功能也应该保留?

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = ...
        Data.weather() ** ??? **
        cell.label.text = "" // value from weather
        return cell
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   gebirgsbärbel    7 年前

    cellForRowAt indexPath 这是个坏主意。每当用户滚动表视图时,就会调用该方法。这可能会导致大量网络通话。

    • 使 仅在需要时进行网络呼叫 viewWillAppear 。每次应用程序切换到您的tableView时,都会调用此方法
    • 百货商店 array
    • reloadData
    • cellForRowAt索引 大堆

    class WeatherTableView: UITableView {
      var weatherData: [String]
    
      override func viewWillAppear(_ animated: Bool) {
        loadWeatherData()
      }
    
      private func loadWeatherData() {
        // I just set some data here directly. Replace this with your network call
        weatherData = ["Here comes the sun", "Rainy with chance of meatballs", "It's raining cats and dogs"]
        // Make sure the tableView is redrawn
        tableView.reloadData()
      }
    
      override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "weatherDataCell")
        cell.label.text = weatherData[indexPath.row]
        return cell
      }
    }