我是ios开发的新手。我想使用分页在tableview中加载大量数据。当加载新页面时,我将数据附加到" myMainList"并重新加载tableview,但似乎不是加载更多数据的好方法。我无法在swift中找到一个好的解决方案。
我的json响应中有一个分页对象。
{
"pagination" : {
"total" : 13,
"last_page" : 2,
"per_page" : 10,
"next_page_url" : null,
"current_page" : 2,
"prev_page_url" : "http:\/\/xxxxxxxxxxxx/page=1"
}
}
这是我的代码。希望你能理解我的问题。寻求一个好的解决方案。谢谢。
var pagenationURL = ""
var myMainList : [MyModel] = []
var rowCount : Int = 0
override func viewDidLoad() {
super.viewDidLoad()
let parameters = ["token":NetworkingUtil.getUserToken()]
callWebService(parameters: parameters)
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastItem = rowCount-1
if(indexPath.row) == lastItem {
loadMoreData()
}
}
func loadMoreData(){
let parameters = ["token":NetworkingUtil.getUserToken()]
if(pagenationURL.isEmpty){
print("end of page")
}
else{
callWebService1(parameters: parameters)
}
}
func callWebService(parameters : [String : String]) {
Alamofire.request(Common.getMyExpense(), method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: NetworkingUtil.getAlamoFireHeader()).responseJSON { (Response) in
let error = Response.result.error
let req = Response.request
let res = Response.response
let json = Response.data
if error != nil {
if req != nil && res != nil {
print(req!)
print(res!)
}
}else{
var parsedjson : JSON!;
do {
parsedjson = try JSON(data : json!)
print(parsedjson)
} catch {
print(error)
}
else{
let myExpensejson = parsedjson["results"]
self.pagenationURL = parsedjson["pagination"]["next_page_url"].stringValue
let lostkeyrequestscount : Int = myExpensejson.count
self.rowCount = lostkeyrequestscount
self.myMainList = []
for(_,keylist): (String,JSON) in myExpensejson
{
let status = lostkeylist["status"].stringValue
let date = lostkeylist["date"].stringValue
let keyObject = MyExpenseModel(status: status, date: date)
self.myMainList.append(keyObject)
self.tableview.reloadData()
}
}
}
}
}
func callWebService1(parameters : [String : String]) {
Alamofire.request(pagenationURL, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: NetworkingUtil.getAlamoFireHeader()).responseJSON { (Response) in
let error = Response.result.error
let req = Response.request
let res = Response.response
let json = Response.data
SVProgressHUD.dismiss()
if error != nil {
if req != nil && res != nil {
print(req!)
print(res!)
}
}else{
var parsedjson : JSON!;
do {
parsedjson = try JSON(data : json!)
print(parsedjson)
} catch {
print(error)
}
else{
let myExpensejson = parsedjson["results"]
self.pagenationURL = parsedjson["pagination"]["next_page_url"].stringValue
let lostkeyrequestscount : Int = myExpensejson.count
self.rowCount = lostkeyrequestscount+self.rowCount
for(_,keylist): (String,JSON) in myExpensejson
{
let status = lostkeylist["status"].stringValue
let date = lostkeylist["date"].stringValue
let keyObject = MyExpenseModel(status: status, date: date)
self.myMainList.append(keyObject)
self.tableview.reloadData()
}
}
}
}
}
答案 0 :(得分:1)
我用于分页或无限滚动用Objective-C编写的包。这对我很有帮助。
套餐:UIScrollView+InfiniteScroll
使用方法:
// add inifinite scroll
self.tableView.addInfiniteScroll { [unowned self] (tableView) in
self.loadMore()
}
// Preload more data 800pt before reaching the bottom of scroll view.
self.tableView.infiniteScrollTriggerOffset = 800
在功能 loadMore 中,我从服务器加载项目,然后保存当前页面。
我希望能帮助你解决上面的问题!
答案 1 :(得分:0)
不仅是你的问题,必须首先改进服务器端。 我通过给出参数偏移来解决这个问题。
var offset = 0
let params: Parameters = [... , "offset": offset]
每次加载更多时,偏移量增加10 //for your case, it is 10
首先加载10,然后加载第二个10,依此类推。
与服务器端开发人员讨论,他们知道。