以下是我的代码,其中我在下拉时在顶部加载更多内容。当我到达最后一页并再次拉取时,它会继续调用 fetchMessages。如何停止此代码显示加载更多单元格并在达到页面限制时停止获取更多数据?
class ViewController: UIViewController {
@IBOutlet weak var messagesTable: UITableView!
private var messageArray: [String] = []
let pageSize: Int = 20
let totalPages: Int = 3
var currentPage: Int = 0
var isLoading: Bool = false
var hasMore: Bool = true
private func loadMoreMessages() {
if self.isLoading {
return
}
if self.currentPage < 1 {
self.loadMessagesFirstTime()
return
}
self.isLoading = true
fetchMessages(page: self.currentPage + 1) { (messages) in
if messages.count > 0 {
for message in messages {
self.messageArray.insert(message, at: 0)
}
self.messagesTable.reloadData()
let lastIndexPath = IndexPath(row: messages.count - 1, section: 0)
self.messagesTable.scrollToRow(at: lastIndexPath, at: UITableViewScrollPosition.top, animated: false)
self.currentPage += 1
} else {
self.hasMore = false
self.messagesTable.reloadData()
}
self.isLoading = false
}
}
private func loadMessagesFirstTime() {
print("loadMesagesFirstTime")
self.isLoading = true
self.hasMore = true
self.currentPage = 1
fetchMessages(page: 1) { (messages) in
self.messageArray.removeAll()
if messages.count > 0 {
self.messageArray.append(contentsOf: messages.reversed())
self.messagesTable.reloadData()
let lastIndexPath = IndexPath(row: self.messagesTable.numberOfRows(inSection: 0) - 1, section: 0)
self.messagesTable.scrollToRow(at: lastIndexPath, at: UITableViewScrollPosition.bottom, animated: false)
} else {
self.hasMore = false
self.messagesTable.reloadData()
}
self.isLoading = false
}
}
}
extension ViewController {
func fetchMessages(page: Int, completed: @escaping ([String]) -> Swift.Void) {
print("fetchMessages, page: (page)")
DispatchQueue.global().async {
sleep(1)
DispatchQueue.main.async {
var messages: [String] = []
if page <= self.totalPages {
for index in 0..<self.pageSize {
messages.append("Row ((page-1) * self.pageSize + index)")
}
}
completed(messages)
}
}
}
}
extension ViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.hasMore {
return self.messageArray.count + 1
} else {
return self.messageArray.count
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var row = indexPath.row
if self.hasMore {
if row == 0 {
let reusableIdentifier = "LoadingCell"
let cell = tableView.dequeueReusableCell(withIdentifier: reusableIdentifier) ??
UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: reusableIdentifier)
cell.textLabel?.text = "Loading ..."
return cell
}
row -= 1
}
let reusableIdentifier = "MessageTableViewCell"
let cell = tableView.dequeueReusableCell(withIdentifier: reusableIdentifier) ??
UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: reusableIdentifier)
cell.textLabel?.text = self.messageArray[row]
return cell
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if indexPath.row == 0 {
loadMoreMessages()
}
}
}
输出:
加载Mesages第一次
获取消息,页: 1
获取消息, 页: 2
获取消息, 页: 3
获取消息,页数:4 <== 这不应该被称为,因为我们已经达到了页数限制。
获取消息, 页: 4
获取消息, 页: 4
获取消息, 页: 4
获取消息, 页: 4
试试这个:
if page < self.totalPages