在Swift中的UITableView(客户端和服务器端)中加载更多
调用Rest API并在UITableView中滚动时检索大量数据
介绍
我一直想知道移动应用程序如何通过在需要时以便捷的方式加载向下滚动来加载更多数据,从而管理UITableView和UICollectionView显示的数据。 我还试图从服务器端以及客户端对这个问题找出一个全面的观点。
好吧,所以我们在这里尝试承担这个常见问题的负担,并以这种方便的方式简化答案。 我们走吧。 👶
场景:
我们将使用PHP Laravel框架(服务器端)实现Rest API,它将在每次调用中返回最新的feed作为大量数据(20项)。 迅速的代码可以使用API向下滚动以加载更多数据。
服务器端 :
该API将返回大量数据,例如ex。 每个呼叫分别以降序排列20个订阅源。 这样,第一个呼叫的最新20个提要,第二个呼叫的最近20个提要之前的下一个..依此类推。
take(20) :将查询返回的结果数限制为20。
skip(0) :跳过查询中给定数量的结果。 这样,在第一个调用中, skip(0)不会跳过任何提要,而在第二个调用中, skip(20)会跳过前20个提要,并检索最近的2o个提要之前的下一个提要,依此类推…… skip(40),跳过(60) …等等。
公共函数 getData($ bulk_no)
{
return Feed :: orderBy ( 'created_at' , 'desc' )-> skip($ bulk_no)-> take(20)-> get();
}
客户端 :
嗯,有许多基于swift的库用于执行HTTP请求。 其中最好的之一是Alamofire。 由于其简单性并减轻了网络任务的负担,并提供了用户友好的请求/响应方法。
ViewController将实现UITableView,在cellForRowAt委托方法将如下所示:
var bulk_no = 0
func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell {
.......
如果indexPath.row> = bulk_no-3 {
callFeedAPI()
}
返回单元
}
bulk_no :Int var默认值= 0 。 并具有最后一项的价值; 这样,第一个电话将更新为20 ,第二个电话将更新为40 ,依此类推…
调用Almofire API方法“ callFeedAPI”
func callFeedAPI(){
let feedAPI = FeedAPI()//模型FeedAPI
feedAPI.callAPI(已完成:{
// API完成后要执行的代码
self.bulk_no = self.dataArray.count
self.tableView.reloadData()
},委托人:自我)
}
}
调用API完成后:
1.更新bulk_no为dataArray count ex。 20、40、60、80等
2.重新加载UITableView数据。
FeedAPI类{
func callAPI(已完成:@转义DownloadComplete,委托:ViewController){
让URL = URL(string:“ URL / \(delegate.lastId)”)
Alamofire.request(URL!)。responseJSON {
切换response.result {
大小写成功:
如果让resultDictionary = response.value为? 字典 {
如果让数据= resultDictionary [“数据”]为? 字典 {
用于数据中的obj {
如果让item = resultDictionary [“ data”]为? 串{
proxy.dataArray.append(项目)
}
}
}
}
打破
案例。失败(让错误):
打印(错误)
}
已完成()
}
}
}
在FeedAPI模型中,这里执行callAPI方法,该方法调用Rest API URL并附加bulk_no以跳过#项,如我们在服务器端所述。
// 服务器端
公共职能 getData( $ bulk_no )
{
return Feed :: orderBy ( ' created_at ' , ' desc ' )-> skip($ bulk_no)-> take(20)-> get();
}
从服务器成功返回状态为成功的Feed之后:将新的批量数据附加到ViewController dataArray上。 并且完成了转义的闭包将返回到。