08-首页

2016-05-29  本文已影响30人  月下独酌灬

首页

课程目标

接口定义

文档地址

http://open.weibo.com/wiki/2/statuses/home_timeline

接口地址

https://api.weibo.com/2/statuses/home_timeline.json

HTTP 请求方式

请求参数

参数 描述
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

微博数据模型

加载微博数据

/// 加载微博数据的方法
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)
    }
}
/// 微博数组视图模型
class HMStatusListViewModel: NSObject {

    // 微博数组
    var statuses: [HMStatus]?
}
/// 加载微博数据的方法
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)
    }
}
/// 微博列表视图模型
lazy var statusListViewModel = HMStatusListViewModel()
// MARK: - 加载数据
statusLiseViewModel.loadData { (isSuccessed) -> () in
    if isSuccessed {
        print("加载成功")
    }else {
        SVProgressHUD.showErrorWithStatus("网络不好")
    }
}

运行测试,印象:由视图模型负责数据处理

显示表格数据

/// 表格标识符
private let HMStatusCellId = "HMStatusCellId"
/// 设置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 设置成了字典

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

/// 微博 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?
// 微博视图模型数组
var statuses: [HMStatusViewModel]?

...

// 字典转模型
if self.statuses == nil {
    self.statuses = [HMStatusViewModel]()
}
// 字典转模型
for dic in array {
    self.statuses?.append(HMStatusViewModel(status: HMStatus(dictionary: dic)))
}
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 中需要注意的

上一篇 下一篇

猜你喜欢

热点阅读