专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
下拉刷新数据分析
- 目前,每次刷新数据都是加载最新的20条数据,实际需要的效果是每次下拉刷新的数据都放到tableView的最前面
- 新浪服务器返回的数据都是经过
微博id
排序的, 微博id大的表示离当前时间越近,排在数组的最上面 - 微博的接口文档说明只传
access_token
表示获取最新的20条数据
,since_id
表示则返回id比since_id大的微博
用于下拉刷新数据,max_id
表示则返回id小于或等于max_id的微博
用于上拉加载更多数据
下拉刷新数据
修改
HMStatusListViewModel
模型的loadStatus
方法,添加since_id
和max_id
参数/** 加载微博数据 */ func loadStatus(since_id: Int, max_id: Int, completion: @escaping ([HMStatusViewModel]?, Error?) -> Void) { // 判断accessToken是否为空 guard let access_token = HMUserAccountViewModel.shared.userAccount?.access_token else { // accessToken为空 return } // url let urlString = "2/statuses/home_timeline.json" // 参数 var parameters: [String: Any] = ["access_token": access_token] if since_id > 0 { parameters["since_id"] = since_id } else if max_id > 0 { // 别人传递了max_id.添加到字典里面 parameters["max_id"] = max_id } // 调用AFN GET请求 ... }
在
HMHomeViewController
定义loadNewData
方法, 获取最大的微博id
赋值给since_id
. 当第一次进入程序,获取不到最大微博id
,赋值0
给since_id
,加载最新
20
条微博数据/** 加载新的微博数据 */ func loadNewData() { print("加载新的微博数据") // 获取id最大的微博, 如果没有数据,就默认加载最新20条微博数据 let since_id = statusVMs?.first?.status.id ?? 0 // 加载微博数据 HMStatusListViewModel.shared.loadStatus(since_id: since_id, max_id: 0) { (statusVMs: [HMStatusViewModel]?, error: Error?) in // 关闭下拉刷新控件 self.refreshView.endRefreshing() // 判断错误 if error != nil { SVProgressHUD.showError(withStatus: "加载微博数据失败,网络不给力") return } // 获取到多少条微博数据 let count = statusVMs?.count ?? 0 // 没有加载微博数据 if count == 0 { print("没有新的微博数据") return } // 如果是下拉刷新,将获取到数据拼接在现有数据的前面 if since_id > 0 { // 下拉刷新 // 最新数据 = 新获取到的数据 + 原有的数据 print("下拉刷新,获取到: \(statusVMs?.count)"); self.statusVMs = statusVMs! + self.statusVMs! } else { // 刚进入程序,加载最新的微博数据 // 最新数据 = 新获取到的数据 self.statusVMs = statusVMs print("获取最新20条数据.获取到 \(statusVMs?.count) 条微博") } } }
- 在刷新控件进入刷新是调用
loadNewData
refreshView.pullToRefreshHandler = { self.loadNewData() }