Ios 分页表视图

Ios 分页表视图,ios,swift,uitableview,swift3,pagination,Ios,Swift,Uitableview,Swift3,Pagination,我是ios开发新手。我想使用分页在tableview中加载大量数据。加载新页面时,我会将数据附加到“myMainList”并重新加载tableview,但这似乎不是加载更多数据的好方法。我无法在swift中找到好的解决方案 我在json响应中得到了一个分页对象 { "pagination" : { "total" : 13, "last_page" : 2, "per_page" : 10, "next_page_url" : null, "current_page" : 2, "prev_pa

我是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()
            }
        }
    }
}
}

这不仅仅是您的问题,服务器端必须首先改进。 我通过在参数中提供偏移量解决了这个问题

var offset = 0
let params: Parameters = [... , "offset": offset]
每次加载更多时,偏移量增加10<代码>//对于您的情况,偏移量为10

加载前10个,然后加载第二个10,依此类推


与服务器端开发人员讨论,他们知道这一点。

我使用Objective-C编写的包进行分页或无限滚动。这对我很有帮助

包装:

如何使用:

// 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
在函数“加载更多”中,我从服务器加载项目并保存当前页面


我希望能帮你回答上面的问题

谢谢你,巴蒂坎