pages.png
TableView
分頁加載是我們在開發(fā)中最常遇到的一種需求劲厌,里面的邏輯并不復(fù)雜,但如何把他們寫好仇矾,代碼能夠盡量多的復(fù)用起來就得下一點(diǎn)功夫了坎吻。
在 Objective-C 中我們可能會通過繼承來抽象分頁的邏輯,但是從代碼工程上是能不用繼承就盡量不要使用揪荣。在 swfit 中我們可以利用 protocol 來很好的抽象這部分邏輯筷黔。
首先我們需要定義分頁的幾個常用的屬性,可用代碼描述如下:
protocol PullToRefreshable: DataSourceType {
/// tableView 所用到的數(shù)據(jù)源
var datas: Pages<Item>? { get set }
/// 刷新的 view 可以是: UIScrollView/UITableView/UICollctionView
var refreshView: UIScrollView { get }
/// 刷新 API 地址仗颈,TargetType 同時封裝了 `url`, `parameters`, `method`
var refreshTarget: TargetType { get }
func loadMore()
func beginRefresh()
/// 在此方法中調(diào)用 tableView.reloadData()
func reloadData()
}
利用 Extension 我們可以默認(rèn)實(shí)現(xiàn)請求網(wǎng)絡(luò)的方法
extension PullToRefreshable {
func refresh() {
Network.default.request(target: refreshTarget) {[weak self] (result) in
self?.refreshView.mj_header.endRefreshing()
switch result {
case let .success(response):
// Added JSON Parser
self?.reloadData()
case .error(_, _):
break
}
}
}
}
類似的其他方法都可以添加默認(rèn)實(shí)現(xiàn)佛舱。
最后我們?nèi)绻膫€ tableView 需要實(shí)現(xiàn)分頁,我們只要去 conform 這個 protocol
即可挨决。代碼大概長這樣:
extension MessageDetailViewController: PullToRefreshable {
typealias Item = MessageDetail
var refreshView: UIScrollView {
return tableView
}
var refreshTarget: TargetType {
return UserTarget.messgaeDetail(account_no: accountNo, page: 1)
}
func reloadData() {
tableView.reloadData()
}
}
是不是簡單了很多呢请祖?
在這里很多同學(xué)會不明白分頁最重要的 page 參數(shù)去哪里了呢?我們可以回到上面看下是不是有個 Pages
對象脖祈,在這里我們封裝了分頁相關(guān)的屬性肆捕,在 loadMore 方法中請求的時候只要將參數(shù) page
賦值成 nextPage
即可。
struct Pages<T: Mappable>: Mappable {
var currentPage: Int = 1
var pageSize: Int = 20
var totalPage: Int = 0
var totalRecords: Int = 0
var items: [T] = [T]()
var nextPage: Int {
return currentPage + 1
}
init?(map: Map) {}
mutating func mapping(map: Map) {
items <- map["items"]
currentPage <- map["current_page"]
pageSize <- map["page_size"]
totalPage <- map["total_page"]
totalRecords <- map["total_records"]
}
}
這里暫時提供了一種思路盖高,部分代碼已被省略慎陵,如果有其他更好的方式,希望多多交流喻奥。