当用户向下滚动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