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