请求推荐数据

请求方式: AFNetworking&Alamofire?

  • 目前在iOS开发中, 请求网络数据, 我们经常会使用第三方框架. 而比较出名的莫过于AFNetworking
  • 不过AFNetworking是使用OC开发的框架,作者又专门针对Swift开发了另外一个框架就是:Alamofire。
  • 因为我们该项目是Swift版本,所有直接采用Alamofire
    • 注:其实Alamofire非常强大,不过我们这里只是发送请求,使用起来是非常方便的。

集成Alamofire

  • 在iOS开发中,如果我们集成一个第三方框架,通常会使用Cocoapods
  • 因此,我们这里通过Cocoapods进行集成
  • 找到项目所在目录:
  • 打开终端:
    • 进入项目目录,执行:pod init操作
    • 之后会生成Profile文件,打开Profile文件(记事本、Xcode打开即可,推荐Xcode打开)
    • 将下面代码粘贴过去
    • 回到终端,执行pod install --no-repo-update命令
    • 关闭程序,通过工作空间打开项目
  1. platform :ios, '8.0'
  2. use_frameworks!
  3. target 'DYZB' do
  4. pod 'Alamofire'
  5. end

工具类的封装

  • 在实际开发中,为了不过于依赖某一个第三方框架,我们经常会在使用的方式封装到某一个工具类中,以便于某天该框架不更新时不至于很多地方都需要修改。

    • 比如之前的ASIHTTPRequest就出现了不更新的情况
  • 因此,我们在使用之前先封装一个简单的工具类。之后在其它任何地方发送网络请求,都依赖于自己的工具类。如果某一天该框架不再更新,我们希望更换框架,只修改工具类中代码即可。
  • 创建工具类:NetworkTools
    • 为工具类提供类方法,方便调用
    • 请求时,需要传入请求方式、地址(URL)、参数(parameters)、回调闭包
    • 在请求方法中,使用Alamofire发送网络请求
  1. import UIKit
  2. import Alamofire
  3. enum MethodType {
  4. case GET
  5. case POST
  6. }
  7. class NetworkTools {
  8. }
  9. extension NetworkTools {
  10. // 封装请求方法
  11. class func requestData(type : MethodType, urlString : String, parameters : [String : AnyObject], finishedCallback : (result : AnyObject) -> ()) {
  12. // 判断请求范式
  13. let method = type == .GET ? Alamofire.Method.GET : Alamofire.Method.POST
  14. // 发送请求,并且将请求到的数据回调
  15. Alamofire.request(method, urlString, parameters: parameters).responseJSON { (respose) in
  16. guard let result = respose.result.value else {
  17. print(respose.result.error)
  18. return
  19. }
  20. finishedCallback(result: result)
  21. }
  22. }
  23. }

MVVM介绍

  • 前面环境配置完成后,我们要请求首页数据。
  • 数据请求在哪里发送了?

MVC模式

  • Model-View-Controller是一个Apple官方推荐的权威范式。

    • 苹果使用的MVC的定义是这么说的:所有的对象都可以被归类为一个model,一个view,或是一个controller。
  • 那么把网络代码放哪里?
    • 我们知道,因为控制器是一个大管家,那么不知道如何安放的代码就放置在控制器中
    • 是的,传统的MVC方式我们经常这么做。
  • 该做法的弊端在哪里?
    • 由于大量的代码被放进view controller,导致控制器变的相当臃肿。
    • 在iOS开发中有的view controller里绵延成千上万行代码的事并不是前所未见的
    • 厚重的View Controller很难维护(由于其庞大的规模);包含几十个属性,使他们的状态难以管理;遵循许多协议(protocol),导致协议的响应代码和controller的逻辑代码混淆在一起。
  • 那么究竟应该放在哪里?
    • 显然MVC的3大组件根本没有适合放这些代码的地方。

MVVM模式

  • MVVM来自微软。和MVC很像,并且引入新的组件ViewModel

    • view model是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他各种各样的代码的极好的地方。
    • 由于展示逻辑放在了view model中(比如网络请求、请求后的数据解析等等),视图控制器本身就会不再臃肿。
  • 因此,该项目中的请求数据,统一交给ViewModel管理。每一个控制器对应一个属于自己的ViewModel。

发送网络请求

接口解析

  • 在推荐的数据展示中,有三个请求

    • 最热数据请求
    • 颜值数据请求
    • 其它数据请求
  • 因此我们需要分别发送三个请求,并且当所有的请求数据拿到之后,对数据进行整理分组排序。(因为界面中有用到分组)
  • 因此请求分成五步曲
    • 请求游戏数据,并且转成模型对象
    • 请求颜值数据,并且转成模型对象
    • 请求热门数据,并且转成模型对象
    • 对数据进行整理,并且放入大的数组中
    • 将数据传递给外面控制器,展示数据

接口描述

  • 接口名称:热门数据(后面热门游戏)
  • 接口地址:http://capi.douyucdn.cn/api/v1/getHotCate
  • 请求参数:
参数名称 参数说明
time 获取当前时间的字符串
limit 获取数据的个数
offset 偏移的数据量
  • 接口名称:颜值数据(第二组颜值数据)
  • 接口地址:http://capi.douyucdn.cn/api/v1/getVerticalRoom
  • 请求参数:
参数名称 参数说明
time 获取当前时间的字符串
limit 获取数据的个数
offset 偏移的数据量
  • 接口名称:大数据数据(第一组热门数据)
  • 接口地址:http://capi.douyucdn.cn/api/v1/getbigDataRoom
  • 请求参数:</br>
参数名称 参数说明
time 获取当前时间的字符串
  1. class RecommendViewModel: NSObject {
  2. lazy var anchorGroups = [AnchorGroup]()
  3. private lazy var hotAnchorGroup = AnchorGroup()
  4. private lazy var prettyAnchorGroup = AnchorGroup()
  5. }
  6. extension RecommendViewModel {
  7. func requestRecommendData(RecommendDataCallback : () -> ()) {
  8. // 0.定义处理闭包
  9. func parserData(result : AnyObject) -> [[String : NSObject]]? {
  10. // 1.将结果转成字典
  11. guard let resultDict = result as? [String : NSObject] else { return nil }
  12. // 2.通过data的key取出对应的数组
  13. return resultDict["data"] as? [[String : NSObject]]
  14. }
  15. // 1.请求热门数据
  16. let group = dispatch_group_create()
  17. dispatch_group_enter(group)
  18. NetworkTools.requestData(.GET, urlString: "http://capi.douyucdn.cn/api/v1/getbigDataRoom", parameters: ["time" : NSDate.getNowTimeString()]) { (result) in
  19. // 1.获取解析的字典数据
  20. guard let dictArray = parserData(result) else { return }
  21. // 2.创建对象
  22. self.hotAnchorGroup.tag_name = "热门"
  23. self.hotAnchorGroup.icon_name = "home_header_hot"
  24. var tempArray = [AnchorModel]()
  25. for dict in dictArray {
  26. tempArray.append(AnchorModel(dict: dict))
  27. }
  28. self.hotAnchorGroup.anchors = tempArray
  29. dispatch_group_leave(group)
  30. }
  31. // 2.请求颜值数据
  32. dispatch_group_enter(group)
  33. NetworkTools.requestData(.GET, urlString: "http://capi.douyucdn.cn/api/v1/getVerticalRoom", parameters: ["limit":"4", "offset" : "0", "time" : NSDate.getNowTimeString()]) { (result) in
  34. // 1.获取解析的字典数据
  35. guard let dictArray = parserData(result) else { return }
  36. // 2.创建对象
  37. self.prettyAnchorGroup.tag_name = "颜值"
  38. self.prettyAnchorGroup.icon_name = "home_header_phone"
  39. var tempArray = [AnchorModel]()
  40. for dict in dictArray {
  41. tempArray.append(AnchorModel(dict: dict))
  42. }
  43. self.prettyAnchorGroup.anchors = tempArray
  44. dispatch_group_leave(group)
  45. }
  46. // 3.请求游戏数据
  47. dispatch_group_enter(group)
  48. NetworkTools.requestData(.GET, urlString: "http://capi.douyucdn.cn/api/v1/getHotCate", parameters: ["limit":"4", "offset" : "0", "time" : NSDate.getNowTimeString()]) { (result) in
  49. // 1.获取解析的字典数据
  50. guard let dictArray = parserData(result) else { return }
  51. // 2.解析数据
  52. for dict in dictArray {
  53. self.anchorGroups.append(AnchorGroup(dict: dict))
  54. }
  55. dispatch_group_leave(group)
  56. }
  57. // 4.所有数据加载完成
  58. dispatch_group_notify(group, dispatch_get_main_queue()) {
  59. self.anchorGroups.insert(self.prettyAnchorGroup, atIndex: 0)
  60. self.anchorGroups.insert(self.hotAnchorGroup, atIndex: 0)
  61. RecommendDataCallback()
  62. }
  63. }
  64. }

展示数据

普通数据展示(文本数据)

  • 将数据回调给控制器后,控制器拿到数据展示数据即可

    • 将Cell中的控件拖入属性
    • 定义模型对象
  • 在控制器中拿到模型,并且将模型传入给Cell进行展示

图片数据展示

  • 在设置网络图片时,OC中经常使用SDWebImage框架。
  • 相同的原因,我们使用的Swift项目,因此这里我使用onevcat, 也就是喵神写的Kingfisher
  • 在Profile中加入框架, 并且执行安装命令
    • pod install —no-repo-update
  1. platform :ios, '8.0'
  2. use_frameworks!
  3. target 'DYZB' do
  4. pod 'Alamofire'
  5. pod 'Kingfisher'
  6. end
  • 使用代码
  1. srcImageView.kf_setImageWithURL(NSURL(string: anchor?.vertical_src ?? "")!)

玩转【斗鱼直播APP】系列之请求展示推荐数据相关推荐

  1. 小码哥-斗鱼直播APP之娱乐基本展示

    娱乐基本展示 效果展示 如图 ! 内容的展示 界面布局 内容的展示依然是一个UICollectionView 懒加载UICollectionView 将UICollectionView添加到控制器的V ...

  2. 小码哥-斗鱼直播APP之娱乐菜单展示

    娱乐菜单展示 效果展示 如图 思路分析 该界面其实非常常见,像微信聊天中就有类似的界面 该界面如何布局呢? 思路一:UIScrollView 整体是一个UIScrollView 在UIScrollVi ...

  3. 微信小程序 index.js获取app.js异步请求的动态数据

    对于 "index.js不能获取app.js异步请求的动态数据" 这个问题,本人也是郁闷了好几分钟. 解决方法是:getApp().wxFunction().then(res =& ...

  4. 玩转【斗鱼直播APP】系列之利用青花瓷抓取数据

    利用青花瓷抓取数据 青花瓷是什么? 当然这里可不是周董的歌曲, 而是我们用于抓取接口的工具. 安装一下这个软件 百度搜索该工具会找到很多绿色版(破解版的文艺说法). 安装即可, 不再累述. 手机端配置 ...

  5. 小码哥-玩转【斗鱼直播APP】系列之利用青花瓷抓取数据

    利用青花瓷抓取数据 青花瓷是什么? 当然这里可不是周董的歌曲, 而是我们用于抓取接口的工具. 安装一下这个软件 百度搜索该工具会找到很多绿色版(破解版的文艺说法). 安装即可, 不再累述. 手机端配置 ...

  6. 玩转【斗鱼直播APP】系列之项目部署

    项目部署目的 任何一个项目最好使用源代码管理工具 源代码管理工具可以帮助我们解决备份.版本回退等等问题 因为是非基础篇,因此具体好处不在累述 常见的源代码管理工具: SVN: 集中式源代码管理工具 G ...

  7. 小码哥-玩转【斗鱼直播APP】系列之项目部署

    项目部署目的 任何一个项目最好使用源代码管理工具 源代码管理工具可以帮助我们解决备份.版本回退等等问题 因为是非基础篇,因此具体好处不在累述 常见的源代码管理工具: SVN: 集中式源代码管理工具 G ...

  8. 第二十篇玩转【斗鱼直播APP】系列之“趣玩”界面展示

    趣玩界面展示 展示效果 效果展示 效果分析 该界面就是一个UICollectionView,并且使用CollectionNormalCell展示内容即可 因为之前已经抽取了BaseAnchorView ...

  9. 小码哥-玩转【斗鱼直播APP】系列之实现无限轮播

    实现无限轮播 生活杂谈 最近很多童鞋私信我,Swift项目有些语法跟不上.希望我出OC版的(OC版我会在后续推出),但是以我的考虑来说,Swift在语言排行版上面其实已经超过OC,另外国内现在新项目一 ...

最新文章

  1. 深度丨人工智能的最大未解之谜是什么?
  2. 由铁路订票系统联想到的
  3. 深入理解弹性盒布局(fiex-box)——Web前端系列自学笔记
  4. python从数分到数编(part2)--随机数及数组
  5. python 广告分析算法_[Python]研究广告渠道的特征数据与结果数据的相关性, 并对渠道作出评分模型...
  6. 计算机二级是要报所有科目吗,我要报考计算机等级考试二级,是全部科目都要考吗?...
  7. notepad++ 自动保存设置
  8. 计算机应用基础 教学工作总结,四年级下期计算机教学工作总结(共3篇)
  9. 数电快速入门(三)(卡诺图化简法的介绍)
  10. 上映4天,票房7.4亿的《海王》,用Python分析数据看大片!
  11. dell g7 重装win10
  12. node 爬虫 实战 - 爬取拉勾网职位数据
  13. Scrapy图片分类异步下载
  14. 最热门的十种编程语言,总有一种适合你
  15. 大漠插件最新版7.2248
  16. C++算法:最大回文子串---动态规划-----夹逼法----中心扩展法
  17. python——difflib内置模块之文本对比
  18. 让小程序完美支持Markdown,最详细教程来了
  19. 【文学文娱】《河北省》的荣光
  20. java获取时间段固定时间_获取固定时间段的每一天时间

热门文章

  1. ML学习笔记- 神经网络
  2. Java常用类(谷粒商城学习记录)
  3. python go rust_一个 Python 初学者应该如何在 Rust 和 Go 之间选择?
  4. 有关名片设计全面知识-名片制作须知
  5. 使用咕咕机2制作单词卡(详细教程)
  6. html 文字浮动flash上,360浏览器让div漂浮在flash上面(div与flash层叠问题)
  7. 乘用车变速器GB/T 28046.3测试多少钱?GB/T 28046.3振动测试
  8. 【SD卡】关于DJYOS下SD卡驱动开发详解
  9. 【数据分析】基于matlab GUI齿轮箱振动数据分析【含Matlab源码 2122期】
  10. 单片射频收发器nRF905及其应用