swift - 在 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
}
}
解决方案
到目前为止,您似乎已经完成了 POC,从 API 获取数据并在屏幕上加载。
对于向前发展的组织,您需要将此代码分解为多个文件。不要太过分,我建议从处理创建 http 请求的细节的 API 类开始,比如 header/body/auth。API 类是否返回 data/json 或电影对象取决于您。您还需要一个模型类,通过 api 类处理跟踪接下来应该从服务器获取的页面。您可以在此处或视图控制器中保留电影数组。
当用户向下滚动时,您可以等待他们到达底部,在发生 api 获取时在最后一个单元格下方显示一个活动指示器,然后在底部插入新结果,或者您可以预获取数据。
这至少应该让你开始。
从 api 返回的对象是否具有可用于未来请求的 id/date/order,例如之前获取项目....希望是的,您可以使用它而不跟踪您所在的页面。
推荐阅读
- reactjs - 使用 React Native/Expo 在 Express 后端进行 Passport 身份验证
- user-interface - 具有可见半径和图像的圆形按钮作为孩子
- javafx - JavaFx Scenebuilder.exe 不会启动,并且看起来包含的 JVM 不会运行。我该如何解决?
- network-programming - 表中静态 LPM 条目的 P4 语法
- wordpress - 我如何在没有 localhost 的网站上工作?
- python - 在 GitHub 上使用 PostgreSQL 数据库存储 Django 项目
- c++ - 如何编写一个弹出消息的dll?
- networking - Windows上是否有类似于“ip tcp-metrics”的东西?
- php - 如何在 laravel 控制器中从邮递员那里获取值
- android - Android Realm - 是否可以在不需要 ID 的情况下更新和删除对象,就像在 Swift 中一样