专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构

下拉刷新数据分析

  • 目前,每次刷新数据都是加载最新的20条数据,实际需要的效果是每次下拉刷新的数据都放到tableView的最前面
  • 新浪服务器返回的数据都是经过 微博id 排序的, 微博id大的表示离当前时间越近,排在数组的最上面
  • 微博的接口文档说明只传 access_token表示获取最新的 20条数据, since_id 表示 则返回id比since_id大的微博用于下拉刷新数据, max_id表示 则返回id小于或等于max_id的微博用于上拉加载更多数据

下拉刷新数据

  • 修改 HMStatusListViewModel 模型的 loadStatus方法,添加 since_idmax_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,赋值 0since_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()
    }
    

results matching ""

    No results matching ""