Swift 分页 JSON

Swift pagination with JSON

我试图在向下滚动的同时获取新数据并将新数据附加到之前的数据。我试图通过页码获取它,但是当我向下滚动时,下一页的数据已加载,但前一页的数据已经消失。我该怎么办?

func parse(json: Data){
    let decoder = JSONDecoder()
    if let jsonMovies = try? decoder.decode(Movies.self, from: json){
        movies = jsonMovies.results
        
        collectionView.reloadData()
        
    }
}

func getData() {
    let urlString = "https://api.themoviedb.org/3/movie/top_rated?api_key=58ea4fe48390e0d2e32f6d608a6e7b47&language=en-US&page=\(currentPage)"
    
    if let url = URL(string: urlString) {
        if let data = try? Data(contentsOf: url){
            parse(json: data)
            
        }
    }
    
}

// This is the function that increments page number and calls the API function
func loadNewItemsFrom(currentPage: Int){
    self.currentPage += 1
    getData()
    
    collectionView.reloadData()
  
}


override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    let offsetY = scrollView.contentOffset.y
    let contentHeight = scrollView.contentSize.height

    if offsetY > contentHeight - scrollView.frame.size.height {
        /* increment page index to load new data set from */
        
        /* call API to load data from next page or just add dummy data to your datasource */
        /* Needs to be implemented */
        loadNewItemsFrom(currentPage: currentPage)

        /* reload tableview with new data */
        collectionView.reloadData()
    }
}

现在,您只是在做 movies = jsonMovies.results,它会清除 movies 中以前存在的内容,并将其设置为新结果。相反,您可能希望将结果附加到 movies 数组(类似于 movies.append(contentsOf: jsonMovies.results)

最终,您需要更强大的逻辑来测试这些结果是否真正属于最后,例如 API 响应是否乱序返回。

说到 API 响应,您需要考虑使用 URLSession 之类的东西来加载您的数据,而不是 Data(contentsOf: url) ,后者将同步加载数据并成为一个瘟疫关于你的滚动性能。这里有很多关于使用 URLSession 的有用信息,您可以在这里阅读有关它的 Apple 教程:https://developer.apple.com/documentation/foundation/url_loading_system/fetching_website_data_into_memory