首页 > 解决方案 > 在 Swift 中向下滚动包含许多 JSON 页面的 TableView

问题描述

伙计们。我需要滚动我的 TableView 并从一些 JSON 页面加载数据。我只为一页执行此操作,但我不知道如何为多页执行此操作。这是 API http://www.omdbapi.com/?s=world&page=2&apikey=eae75c46

这个 API 有属性“TotalResult”,所以我可以得到这个并除以 10。在这种情况下是 7180/10,所以我有 718 个页面。但我不知道该怎么办了。

import UIKit

class FilmsViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var films = Films()

    override func viewDidLoad() {
        super.viewDidLoad()

        getDate()

    }

    func getDate() {
        let session = URLSession.shared

        session.dataTask(with: URL(string: "http://www.omdbapi.com/?s=world&apikey=eae75c46")!) { (data, response, error) in
            guard let data = data else { return }

            do {
                self.films = try JSONDecoder().decode(Films.self, from: data)
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            } catch {
                print(error)
            }
            }.resume()
    }

    func configureCell(cell: FilmsCell, for indexPath: IndexPath) {

        guard let search = self.films.search else { return }
        let films = search[indexPath.row]
        cell.titleFilmLabel.text = films.title
    }

}

extension FilmsViewController: UITableViewDelegate {

}

extension FilmsViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        guard let search = self.films.search else { return 0 }
        return search.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! FilmsCell

        configureCell(cell: cell, for: indexPath)

        return cell
    }
}

标签: swift

解决方案


到目前为止,您似乎已经完成了 POC,从 API 获取数据并在屏幕上加载。

对于向前发展的组织,您需要将此代码分解为多个文件。不要太过分,我建议从处理创建 http 请求的细节的 API 类开始,比如 header/body/auth。API 类是否返回 data/json 或电影对象取决于您。您还需要一个模型类,通过 api 类处理跟踪接下来应该从服务器获取的页面。您可以在此处或视图控制器中保留电影数组。

当用户向下滚动时,您可以等待他们到达底部,在发生 api 获取时在最后一个单元格下方显示一个活动指示器,然后在底部插入新结果,或者您可以预获取数据。

这至少应该让你开始。

从 api 返回的对象是否具有可用于未来请求的 id/date/order,例如之前获取项目....希望是的,您可以使用它而不跟踪您所在的页面。


推荐阅读