标签:
1.1 基本实现
由于一旦授权成功,新浪返回的accessToken是同一个值(针对同一个第三方应用,同一个账号),为避免每次都重新登录,应该讲accessToken存储起来。
实现:先检测沙盒里面是否存在accessToken,若无,则意味从来没有登陆过,加载登录界面,一旦成功登录,就将获得的accessToken存进沙盒,下次进来就不需要再进行登录,直接从沙盒中取出accessToken,进入首页,获取用户数据。
1>在发送请求,成功获取accessToken方法后,将返回的JSON(AFN自动解析成字典),字典保存到沙盒中
2>在程序运行的时候,根据是否存在上述保存的帐号信息,判断是否需要登录界面
3> 在手机开发中,授权成功后的回调地址一般是不需要的,需要拦截网络请求,在UIWebView代理方法中拦截,即在获取利用code获取accessToken方法之后,禁止加载回调地址
4>授权成功后,切换窗口根控制器为WBTabBarViewController或者新特性控制器(第一次登陆)
1.2 存在问题
1> 上述代码很多和appDelegate中的代码重复
2> 代码不严谨,还没有判断accessToken是否已经过期
3> 上述保存的帐号信息,均是直接对字典进行操作,需要通过key去取值,需要封装成模型
1.3 添加帐号模型
1> 根据access_token、expires_in、uid,添加帐号字典,并提供类方法,字典转模型
2> 将请求成功后返回的字典,转成模型,再存入沙盒
3>在程序运行时,判断沙盒中是否存在帐号信息,取出模型
4> 注:自定义对象需要存入沙盒、从沙盒中取出,需要遵循NSCoding协议!!!
5>在网络请求的时候添加蒙版MBProgressHUD
并且在请求成功/失败获取accessToken后隐藏。
专门对帐号模型的保存、获取进行封装,处理帐号相关业务
注:在帐号模型中添加获取accessToken的时间,用于判断以后accessToken是否过期
1.2节中已经指出,上述代码在授权成功切换控制器和程序运行切换控制器中的代码存在很多重复,需要将代码抽取出来,将切换控制器封装到UIWindow的分类当中。
注:使用的是对象方法,对UIWindow对象进行操作
使用Foundation+Log,查看打印数据。
注1:需要将昵称储存,在设置- (void)setupNav方法中,先取出沙盒中的昵称,再去发网络请求,看昵称是否改变,存储到HWAccount模型中
注2:HWAccount中的存储时间不应该放在HWAccountTool的
+(void)saveAccount:(HWAccount *)account方法中,而应该放在字典转模型
+(instancetype)accountWithDict:(NSDictionary *)dict方法中
注3:encodeWithCoder;initWithCoder两个方法中也要写昵称属性
5.1 使用imageEdgeInsets、 titleEdgeInsets说明
注1:首页导航栏的titleView中文字和图片的间距,不能用UIEdgeInsetsMake固定死,因为用户的昵称会改变,文字的长度也会改变
注2:什么情况下建议使用imageEdgeInsets、titleEdgeInsets
如果按钮内部的图片、文字固定,用这2个属性来设置间距,会比较简单
标题宽度(乘上scale系数,保证retina屏幕上的图片宽度是正确的)
CGFloattitleW = titleButton.titleLabel.width * [UIScreen mainScreen].scale;
CGFloatimageW = titleButton.imageView.width * [UIScreen mainScreen].scale;
CGFloatleft = titleW + imageW;
titleButton.imageEdgeInsets= UIEdgeInsetsMake(0, left, 0, 0);
5.2 自定义HWTitleButton
注1:在这里只需要修改文字和图片的x即可!
注2:下面的方法会引发死循环
此时在HWHomeViewController的setupNav方法中只需要这么做即可
注:使用SDWebImage需要对内存警告做处理
7.1 基本实现
1> HWUser
2> HWStatus
3>在HWHomeViewController中对网络返回的字典转换成模型数组,并在tableView代理方法中使用模型
4>在setupUserInfo方法中获取用户昵称也使用用户模型
7.2 MJExtension框架 --- 重要
问题:上述字典转模型的方法比较繁琐,而且又有模型嵌套。
解决方法:利用MJExtension框架(底层用runtime实现),可以快速实现字典/模型相互转换,还可以实现字典数组直接转模型数组等很多快捷功能!!!
1> 导入框架
2> 删除原先的字典转模型方法
3>修改如下
UIRefreshControl– 下拉刷新控件
iOS开发 - 第05篇 - 项目 - 04 - OAuth授权 & 首页
标签:
原文地址:http://blog.csdn.net/nsryan/article/details/52107741