Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios swift-从reddit API添加帖子的tableview分页_Ios_Swift_Uitableview_Pagination_Reddit - Fatal编程技术网

Ios swift-从reddit API添加帖子的tableview分页

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

我从RedditAPI获取数据,并在tableview中显示Reddit帖子。我想一次从api加载5篇(例如)文章并显示它们,然后在用户向下滚动到最后五个单元格时加载接下来的5篇文章。
也许我需要改变从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以返回正确的页面响应。有关详细信息,请参阅本教程