Github Client
这个demo通过Oauth2授权登陆获取User信息,并将repo信息以TableView形式展现出来,对AFNetworking进行了网络请求的封装,用Realm数据库做了缓存(Etag),几个动画效果:Launch app 动画、转场动画、UITableViewCell动画,还有一个Github的Trending页面。
代码见:https://github.com/ioriginal/GithubClient
1. 对网络请求的封装
在这个demp app中网络请求封装分成了三个类:BaseRequest 类、HttpClient类、HttpConfiguration类。
BaseRequest 类:app中每个发起的网络请求都是这个类的子类,也就是说,将请求都对象化,在创建了继承自这个类的子类之后,通过重写的方式,配置该子类的RequestURL、请求头、GET or POST、参数等等内容,然后使用这个子类的实例调用- (void)starWithFinishedBlock:(RequestCallBack)finishedCallBack方法发起网络请求,通过block的方式将error和responseObject返回。
HttpConfiguration类:这个类负责管理网络请求的服务器地址。
HttpClient类:发起网络请求,对AFNetworking的封装。
2.Etag 数据库缓存
1. 在viewDidLoad里先查询数据库是否保存了当前页面所需要的数据,有则直接读取出来,更新UI,然后发起网络请求,没有则直接发起网络请求。
2. AFNetworking 默认的进入success回调里返回的状态码为200-299,如果想接受304状态码,在发起网络请求之前,还需给acceptableStatusCodes添加304。Etag用NSUserDefaults存储起来,在发起请求之前,取出key为当前URL的Etag,然后headerFields加上"If-None-Match",进行网络请求,如果返回状态码304,则返回的responseObject为空,不用刷新UI,如果返回的状态码为200,则返回新的数据,此时需要update数据库里面的数据,并且重新以当前的URL为key存储Etag,然后从数据库里读取数据,刷新UI。
数据库:
Realm:所需要存储的对象都需要继承自RLMObject,不能自定义getter和setter,realm会帮我们生成getter、setter,查询的结果不是Array,需要遍历结果,将数据存到本地的Array中刷新UI。
FMDB:对SQLite的封装。
SQLite:
3. 图片缓存
SDWebImage实现的思路如下: