Ios swift-从reddit API添加帖子的tableview分页
我从RedditAPI获取数据,并在tableview中显示Reddit帖子。我想一次从api加载5篇(例如)文章并显示它们,然后在用户向下滚动到最后五个单元格时加载接下来的5篇文章。Ios swift-从reddit API添加帖子的tableview分页,ios,swift,uitableview,pagination,reddit,Ios,Swift,Uitableview,Pagination,Reddit,我从RedditAPI获取数据,并在tableview中显示Reddit帖子。我想一次从api加载5篇(例如)文章并显示它们,然后在用户向下滚动到最后五个单元格时加载接下来的5篇文章。 也许我需要改变从api获取帖子的逻辑。请给我一些建议。谢谢大家! 我正在使用MVVM。使用TableViewController中的POST数据填充tableview单元格: override func tableView(_ tableView: UITableView, cellForRowAt indexP
也许我需要改变从api获取帖子的逻辑。请给我一些建议。谢谢大家! 我正在使用MVVM。使用TableViewController中的POST数据填充tableview单元格:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell") as! PostTableViewCell
vm.getPost(at: indexPath.row) { post in
guard let post = post else { print("No post"); return }
print(post)
DispatchQueue.main.async {
cell.usernameLabel.text = post.username
cell.domainLabel.text = post.domain
cell.titleLabel.text = post.title
cell.detailsLabel.text = post.text
cell.postImage.sd_setImage(with: URL(string: "\(post.imageURL)"))
cell.timePassedLabel.text = post.createdHoursAgo
cell.ratingButton.setTitle("\(post.rating)", for: .normal)
cell.commentsButton.setTitle("\(post.comments)", for: .normal)
}
// pagination
}
return cell
}
获得一个帖子:
class PostViewModel {
var limit = 30
let sub = "ios"
var portion = 5
var post: RedditPost?
func getPost(at postIndex: Int, completion: (@escaping (_ data: RedditPost?) -> Void)) {
UseCase().createPosts(sub: sub, limit: limit) { posts in
// there are not so many posts on reddit as you asked for (as limit)
if self.limit > posts.count {
print("Error: Number of demanded posts are bigger than available on Reddit")
completion(nil)
} else {
let post = posts[postIndex]
self.post = post
completion(post)
}
}
}
}
从API获取所有帖子:
class UseCase {
func createPosts(sub: String, limit: Int, completion: (@escaping (_ data: [RedditPost]) -> Void)) {
Repository().fillPostsArray(sub: sub, limit: limit) { (redditPosts: [RedditPost]) in
completion(redditPosts)
}
}
}
响应到来时,应通过
viewdiload
方法和reload
表视图进行第一次API调用
override func viewDidLoad() {
super.viewDidLoad()
setupTableView()
loadPostsFromRedit()
}
private func loadPostsFromRedit() {
vm.getPost(at: indexPath.row) { [weak self] posts in
guard let self = self, let post = posts else {
return
}
print(posts)
self.post = posts
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
分页:
您可以使用willDisplayCell
方法检查用户是否已到达tableView
的末尾,并调用API加载下一页
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if post.count == indexPath.row - 1 {
vm.loadMorePosts()
}
}
注意:您还需要将页面索引传递给redit API以返回正确的页面响应。有关详细信息,请参阅本教程