当用户向下滚动UITableView的末尾并发现API仍然有另一个页面可用时,我的以下代码将再次调用api。

ViewController

func loadMoreJobs(page: Int) {
        let params = [
            "session_token": JBCSettings.sessionToken,
            "page_count": "\(page)"
        ]
        JBCService.shared.getService(request: JBCRouter.jobs(params), callbackSuccess: { (obj: ObjectJobs?) in
            if obj?.status == 1 {

                self.jobsDataSource = JBCJobsDataSource()
                self.jobsDataSource?.jobTableView = self.jobTableView
                self.jobsDataSource?.job = obj.jobList
                self.jobsDataSource?.isEnd = (obj?.end)!

            }
        }) { (status, obj) in

        }
    }


和JBCJobsDataSource

class JBCJobsDataSource: NSObject {

    var job = [JobObject]() {
        didSet {
            reloadTableView()
        }
    }
    var isEnd: Int = 0

    weak var jobTableView: UITableView? {
        didSet {
            setupTableView()
        }
    }

    func setupTableView() {
        if jobTableView != nil {
            jobTableView?.backgroundColor = UIColor.clear
            jobTableView!.delegate =  self
            jobTableView!.dataSource = self
            jobTableView!.register(UINib(nibName: "JobCell", bundle: nil), forCellReuseIdentifier: JobCell.cellIdentify())
        }
    }

    func reloadTableView() {
        DispatchQueue.main.async {
            self.jobTableView?.reloadData()
        }
    }
}

extension JBCJobsDataSource: UITableViewDelegate, UITableViewDataSource {

    func dataForRowAtIndexPath(_ indexPath:IndexPath) -> JobObject {
        return job[indexPath.row]
    }

    .
    .
    .

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if ((indexPath.row+1) == job.count && isEnd == 1) {
            _ = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
        }
    }

    @objc func update() {
        JBCServiceExecute.jobNoti(page: true)
    }
}


问题是isEnd变量从未在JBCJobsDataSource内部更新。这就是为什么即使找不到更多记录,代码仍然调用loadMoreJobs的原因。因此,请让我知道如何刷新对

        self.jobsDataSource = JBCJobsDataSource()
        self.jobsDataSource?.jobTableView = self.jobTableView
        self.jobsDataSource?.job = obj.jobList
        self.jobsDataSource?.isEnd = (obj?.end)!

最佳答案

问题是isEnd变量从不更新
  JBCJobsDataSource。


这是因为您每次在JBCJobsDataSource方法的回调中都创建一个新的JBCService.shared.getService实例:

// the below line is the reason of the problem:
self.jobsDataSource = JBCJobsDataSource()

self.jobsDataSource?.jobTableView = self.jobTableView
self.jobsDataSource?.job = obj.jobList
self.jobsDataSource?.isEnd = (obj?.end)!


如前所述,代码说的是:“每次调用callbackSuccess时都要创建一个新实例”,显然每个实例对其属性都有自己的独立值。

因此,要解决此问题,您可能应在视图控制器的生命周期(调用jobsDataSource的生命周期)中实例化一次loadMoreJobs,您可以这样做:

var jobsDataSource = JBCJobsDataSource()


删除以下行:

self.jobsDataSource = JBCJobsDataSource()


或者:如果在访问视图控制器时无需直接使用jobsDataSource,则可以将其声明为惰性属性:

lazy var jobsDataSource = JBCJobsDataSource()




顺便说一句,对于处理数据源和视图控制器表视图的委托,您不必在jobTableView中声明JBCJobsDataSource,您可以这样做:

实例化jobsDataSource之后:

self.jobsDataSource?.jobTableView.dataSource = jobsDataSource
self.jobsDataSource?.jobTableView.delegate = jobsDataSource

10-02 00:12