RLMZ基本框架浅谈

2015-11-25  本文已影响68人  花生儿

文章参照了《iOS应用架构谈》,对比自己的项目进行了总结。会持续修改,感谢《iOS应用架构谈》的作者。

RLMZiOS客户端架构看似简单,其实要考虑的事情也不少。

针对App进行要求

View层

View层是最接近业务底层的架构,影响业务层代码程度最深,所以View层一旦定性,改动空间最小。所以在View层不光要实现功能,还要考虑更多规范的东西,防止业务工程师的代码腐蚀View架构。

要点如下

所有的属相都使用getter和setter方法,@synthesize,@dynamic根据不同的情况,酌情使用,正确运用内存管理语义。

getter 和 setter全部都放在最后

每一个delegate都把对应的protocol名字带上,delegate方法不要到处乱写,写到一块区域里面。建议使用#pragma mark - 进行标明。button ,getsturRecognizer等响应事件放在一个区域里面,总之就是把delegate,event response,life cycle等方法都合理的分块放置。

对于view的布局,无论使用Frame还是使用Autolayout,都需要经过精心的设计,Autolayout可以考虑使用Masonry,Frame的话,一定要控制好可读性。

关于storyboard,nib和代码写View如果是简单视图,个人建议多使用code,对于简单界面,code一样简单,复杂界面,code比storyBoard更简单,所以个人更喜欢用code画View而不是其他。

对于业务抽象,建议还是MVC设计模式,M-model做的事包括(给viewcontroller提供数据,给viewcontroller存储数据提供接口,提供经过抽象的业务基本组件,供controller调度),C-Controller做的包括(管理view Controller的生命周期,负责生成所有view的实例,监听来自View与业务有关的事情,通过Model的合作,来完成对应事件的业务),v-View做的事情(1.响应与业务无关的事件 ,并因此引发动画效果,点击反馈。2.界面元素表达)

也可以用MVCS,至于MVVM,理解尚欠,只肤浅的知道ReactiveCocoa。

调用网络API

iOS端,AFNetworking几乎已经成为了业界新项目的标配。

网络层跟业务对接部分的设计

以什么样的方式将数据交付给业务层

大多数App在网络层采用的方案大概有三种:Delegate,Notification,block。目前RLWapp采用的是Notification为主,delegate辅助的方式。RLMZapp采用的是block的方式。

比较两款app,根据以往经验和跟其他同学讨论,个人觉得,比较好的方式是Delegate为主,Notification为辅的方式。尽管我认为,最方便的,最炫的还是用block。

因为这样可以尽可能的减少跨层数据交流的可能,限制了耦合。(RLWNotification为主的方式,偶核性比较大,后来以Delegate方式辅助的原因也是为了降低耦合性)。

统一回调方法,便于调试和维护(RLW采用的是统一的回调方法,相比于瑞丽没赚,更易维护。)

在跟业务层对接的部分只采用一种对接手段,限制灵活性来换取更多的可维护性。

交付什么样的数据给业务层

RLMZApp网络层拿到的数据是JSON,然后将JSON转换成对应的对象模型,目前RLW,RLMZ都是采用的这种方式。这种做法是能够提高后续操作的可读性。当然Model转化过程成本很大。目前的两款app解析json都是采用的手动解析JSON 数据,优点是效率是最高的,缺点是费时间,转化之后的模型不能直接被展示,如果想展示,需要二次转化,调试的时候也不直观。但是目前没有找到更好的处理方法。

对于手动解析JSON,也可以利用github上的知名JSON直接转NSObject的三方库来进行处理。

对于API的调用,是使用集约型API调用方式还是使用离散型API调用方式

集约型API调用方式就是API的调用就用一个类,然后这个类接收API的名字,API参数还有回调着陆点(block,delegate)等作为参数。RLMZ在使用这种方式。

离散型API调用,就是一个API对应一个APIRequest。RLW在使用这种方式。

个人喜欢更熟练使用离散型API调用。

网络层的安全机制的实现

网络安全机制,目前主要考虑的就两点。

确保API的调用者是来自你我们自己的APP,防止竞争对手爬我们的API。

解决方法个人感觉让服务端给一个秘钥,调用API的时候使用这个秘钥+API名字+API参数算一个hash。如果我做,就用hash算法(md5),请求的时候带上这个hash。服务端收到请求后,按照同样的秘钥同样的算法也算出一个hash。然后做一个比较,如果一致,就确认确实是自己的APP。(目前咱们这块应该是也没有完成。)

如果我们对外提供了需要注册才能使用的API平台。我们需要有个机制来识别是否注册用户调用了我们的API 。(感觉目前咱们用不到,没多研究)、

保证传输数据的安全

苹果目前已经要求使用Https,挺复杂的,了解不多。目前咱们用的是http协议。这方面有待学习。

网络层的优化方案

从App本身来做的优化

使用缓存手段,减少请求的发起次数。API调用请求来说,有些API请求所带来的数据的时效性是比较长的,比如RLMZ的试用,试用详情,试用报告,试用文章。都可以针对这些数据做本地缓存,

还有对图片的缓存,图片缓存的缓存策略一般都是利用比较知名的三方库,比如SDWebImage几乎成了苹果应用的标配。

试用策略来减少请求的发起次数,主要是针对重复请求策略的。

界面下拉刷新的这种请求,存在重复请求的情况。(比如下拉刷新的时候,在请求着陆之前,用户可能会不断执行下拉刷新操作,那么这个时候,后面重复的API请求就可以不必发送了)

如果是条件筛选这种,就要取消前面已经发送的请求。虽然很有可能这个请求已经被执行了,那么取消所带来的性能提升就基本没有了。但如果这个请求还在队列中待执行的话,那么对应的这次链接就可以省掉了。

数据本地持久化

动态部署方案

对App团队进行的要求

收集用户数据,给产品和运营提供参考

合理的组织各业务方开发的业务模块,以及相关基础模块

每日APP都需要打包,提供给QA工程师测试。

上一篇下一篇

猜你喜欢

热点阅读