首页
课程目标
- 网络 JSON 转模型
- 自定义 Cell
接口定义
文档地址
http://open.weibo.com/wiki/2/statuses/home_timeline
接口地址
https://api.weibo.com/2/statuses/home_timeline.json
HTTP 请求方式
- GET
请求参数
参数 | 描述 |
---|---|
access_token | 采用OAuth授权方式为必填参数,其他授权方式不需要此参数,OAuth授权后获得 |
since_id | 若指定此参数,则返回ID比since_id大的微博(即比since_id时间晚的微博),默认为0 |
max_id | 若指定此参数,则返回ID小于或等于max_id的微博,默认为0 |
测试 URL:https://api.weibo.com/2/statuses/home_timeline.json?access_token=2.00ml8IrFLUkOXB32bb2d4ddd0u2gmj
微博数据模型
加载微博数据
- 在
HMHomeTableViewController
中添加加载微博数据方法
/// 加载微博数据的方法
private func loadData() {
// 定义 url 与参数
let urlString = "https://api.weibo.com/2/statuses/friends_timeline.json"
let params = [
"access_token": HMUserAccountViewModel.sharedUserAccount.accessToken!
]
HMNetworkTools.shareTools.request(.GET, url: urlString, params: params) { (result, error) -> () in
if error != nil {
print("加载失败\(error)")
return
}
print(result)
}
}
- 执行方法加载微博数据
override func viewDidLoad() {
super.viewDidLoad()
if !UserAccountViewModel.sharedUserAccount.userLogon {
visitorView?.setupInfo(nil, message: "关注一些人,回这里看看有什么惊喜")
return
}
loadData()
}
运行测试
定义微博模型
- 定义微博模型
/// 微博模型
class HMStatus: NSObject {
// MARK: - 模型属性
/// 创建时间
var created_at: String?
/// 微博ID
var id: Int = 0
/// 微博信息内容
var text: String?
/// 微博来源
var source: String?
init(dict: [String: AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
}
- 将返回数据字典转模型
HMNetworkTools.shareTools.request(.GET, url: urlString, params: params) { (result, error) -> () in
...
// 加载成功
guard let statusesDict = result?["statuses"] as? [[String: AnyObject]] else {
return
}
// 字典转模型
// 定义临时数据
var tempArray = [HMStatus]()
for statusDict in statusesDict {
let status = HMStatus(dict: statusDict)
tempArray.append(status)
}
}
- 定义微博列表视图模型
HMStatusListViewModel
/// 微博数组视图模型
class HMStatusListViewModel: NSObject {
// 微博数组
var statuses: [HMStatus]?
}
- 将加载数据的方法移动至
HMStatusListViewModel
/// 加载微博数据的方法
func loadData(completion: (isSuccessed: Bool)->()) {
// 定义 url 与参数
let urlString = "https://api.weibo.com/2/statuses/friends_timeline.json"
let params = [
"access_token": HMUserAccountViewModel.sharedUserAccount.accessToken!
]
HMNetworkTools.shareTools.request(.GET, url: urlString, params: params) { (result, error) -> () in
if error != nil {
print("加载失败\(error)")
completion(isSuccessed: false)
return
}
// 加载成功
guard let statusesDict = result?["statuses"] as? [[String: AnyObject]] else {
return
}
// 字典转模型
// 定义临时数据
var tempArray = [HMStatus]()
for statusDict in statusesDict {
let status = HMStatus(dict: statusDict)
tempArray.append(status)
}
self.statuses = tempArray
completion(isSuccessed: true)
}
}
- 在
HMHomeTableViewController
中增加微博视图模型属性
/// 微博列表视图模型
lazy var statusListViewModel = HMStatusListViewModel()
- 修改
loadData
函数
// MARK: - 加载数据
statusLiseViewModel.loadData { (isSuccessed) -> () in
if isSuccessed {
print("加载成功")
}else {
SVProgressHUD.showErrorWithStatus("网络不好")
}
}
运行测试,印象:由视图模型负责数据处理
显示表格数据
- 定义可重用标识符
/// 表格标识符
private let HMStatusCellId = "HMStatusCellId"
- 在
viewDidLoad
中调用方法注册可重用Cell
/// 设置tableView相关
private func setupTableView(){
// 注册系统的cell
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: HMStatusCellId)
}
- 实现数据源函数
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return statusListViewModel.statuses?.count ?? 0
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(HMStatusCellId, forIndexPath: indexPath)
cell.textLabel?.text = statusListViewModel.statuses![indexPath.row].text
return cell
}
用户模型
定义模型
/// 用户模型
class HMUser: NSObject {
/// 用户UID
var id: Int = 0
/// 友好显示名称
var name: String?
/// 用户头像地址(中图),50×50像素
var profile_image_url: String?
/// 认证类型 -1:没有认证,1:认证用户,2,3,5: 企业认证,220: 达人
var verified: Int = 0
/// 会员等级 1-6
var mbrank: Int = 0
// MARK: - 构造函数
init(dict: [String: AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
override var description: String {
let keys = ["id", "name", "profile_image_url", "mbrank"]
return dictionaryWithValuesForKeys(keys).description
}
}
在 HMStatus
中针对用户模型增加处理
- 增加属性
/// 微博作者的用户信息字段
var user: HMUser?
运行测试,会发现 user 字段被 KVO 设置成了字典
- 修改
HMStatus
的构造函数
override func setValue(value: AnyObject?, forKey key: String) {
// 判断 key 是否是 "user"
if key == "user" {
user = HMUser(dict: value as! [String: AnyObject])
return
}
super.setValue(value, forKey: key)
}
自定义 cell
- 建立
HMStatusCell
自定义Cell
/// 微博 Cell
class HMStatusCell: UITableViewCell {
// MARK: 搭建界面
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupUI() {
}
}
- 建立微博视图模型
/// 微博视图模型
class HMStatusViewModel: NSObject {
/// 微博模型
var status: Status?
/// 构造函数
init(status: Status) {
self.status = status
}
}
- 添加视图模型属性
/// 微博视图模型
var statusViewModel: HMStatusViewModel?
- 修改
HMStatusListViewModel
中的网络代码中字典转模型部分
// 微博视图模型数组
var statuses: [HMStatusViewModel]?
...
// 字典转模型
if self.statuses == nil {
self.statuses = [HMStatusViewModel]()
}
// 字典转模型
for dic in array {
self.statuses?.append(HMStatusViewModel(status: HMStatus(dictionary: dic)))
}
- 修改
HMHomeTableViewController
数据源方法
tableView.registerClass(HMStatusCell.self, forCellReuseIdentifier: HMStatusCellId)
...
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(HMStatusCellId, forIndexPath: indexPath) as! HMStatusCell
// 获取微博的视图模型
let statusModel = statusListViewModel.statuses![indexPath.row]
cell.textLabel?.text = statusModel.status?.user?.name
return cell
}
单元格分析
微博的单元格包含以下 6
种类型:
- 原创微博无图
- 原创微博单图
- 原创微博多图
- 转发微博无图
- 转发微博单图
- 转发微博多图
自定义 Cell 中需要注意的
- 单图会按照图片等比例显示
- 多图的图片大小固定
- 多图如果是4张,会按照
2 * 2
显示 - 多图其他数量,按照
3 * 3
九宫格显示
网友评论