距离上次写博客有一段时间了。几次提笔想写都觉得没什么可写的,好玩的东西没倒腾,iOS又学的不彻底。最近把iOS又看了一段时间,而且基本上是把主要精力放在了iOS的基础知识学习上。这篇博客就写写在做最近这个app的时候一些小结。没有太多干货的东西。

因为最近钟徐琦智能搜索已经上线了各大安卓市场,我就想帮他上一个iOS版本然后借此机会熟悉一些iOS开发的新模式和一些新的开源组件。现在基本上算是完成了整个应用。也在近期准备上线了,有想法做出来之后开源出来,开源到我的github和coding。

下面就是大概小结一下做这个应用的整个过程和最近看到的一些新的东西。


1.网络层的分离

iOS开发官方给出的开发模式是mvc模式,但是至少对我个人来说,我view和controller搞不清楚怎么划分,像coding开源的他们的应用,基本是view层就是cell。我在做的时候view曾也只有cell的存在。

迪哥在做他的上一个项目的时候,利用rac,将网络层单独分离出来。这是我在做智能搜索里最大的变化。这样不算是完整的mvvm模式,但是已经初步有了mvvm模式的雏形。我下一步的计划是继续研究mvvm的模式。虽然mvvm是利用更多的代码来进行整个程序的操作,但是将网络层单独分离确实减少了代码的后期维护难度。

2.cell和tableview的分离

以前对于一个列表的操作总是在一个view里操作。所有的cell里,只是进行数据的加载和界面的布局,这样会导致viewcontroller里代码的冗余和不好管理。

我在这次的app中,使用了block和通知的方式,在cell里修改tableview的界面。说句实话,这样的方式看上去代码量增多了,实际上代码量是减少的,而且更便于后期的维护。

3.三种界面传值的方式

iOS中有三种界面传值的方式,delegate,notice和block。我在这个app中,利用了notice和block。

简单的说一下我个人对这三种方式的理解。

我第一个接触的方法是delegate,delegate的代码量多,但是思路清晰。

第二个是这次运用到的block,block相比较delegate来说,是自己研究出来的,代码量个人觉得相比较delegate来说,简单一些,但是说句实话,到现在为止我都没研究出来block到底是个什么,回调实在是让我觉得是iOS开发里最难理解的部分了。不过现在至少可以简单的使用了。

第三是notice,notice写起来简单,而且全局性强。到现在为止我没有发现notice的不好之处在哪,不仅可以传值,还可以用来调用函数。

在后面的开发中,我可能会尽量多的使用block和notice,逐渐摒弃利用delegate传值的方式,但是不是说以后就不用delegate了。我觉得delegate在更大程度上是在我们自定义控件的时候会大量使用。

4.利用masonry进行纯代码布局

我在一开始是想尝试纯代码布局的,但是因为都用xib所以我大量的使用纯代码布局。 这次尝试了纯代码布局和手写的约束。

没什么感觉…除了适配上更方便了其他暂时没有什么感觉。

我在后期开发中,会采用xib混合纯代码的方式进行界面的布局,因为利用xib在某种程度上会加快开发的进度。在某些复杂的界面,我会考虑纯代码的布局。

5.利用blockskit简化代理

Blockskit是我这次用到的一个第三方库。简单的说,它是以block的方式封装了代理。这样就不用所有代理都实现,直接用回调的方式就可以了。

个人的感觉是这种方法在写alert的代理的时候非常之方便。

6.利用mantle进行model层的解析

Mantle是一款可以将json数据自动匹配到model层的开源组件,但是我觉得mantle的使用比我想象中要复杂一点。但是这种解析model的方式很好的防止了model层代码的冗余。唱吧是采用的mantle对model层进行的解析。

后期可能我会尝试使用mj的mjextension来进行model层的解析。

7.fmdb建立本地数据库

这学期也算是学了数据库了所以不能再有理由不去建立本地数据库了。

因为在智能搜索中,我需要将用户收藏的新闻存储在本地,方便使用人下次使用。

本着熟悉sql语句的想法我开始使用fmdb建立本地数据库。我看的fmdb的demo是唐巧开源在他github上的fmdb使用代码和在我第一个项目中迪哥写的代码。

Fmdb在使用的时候是需要写sql语句,这确实对我一个挑战,不过在两份代码的协助下我基本上完成了建立本地数据库和插入数据和查找数据删除数据。

其实建立本地数据库没有我想象中那么难,但是人嘛,总是不想跨过那第一步。

我深刻的感受到了像qq微信这种应用是做了大量的本地数据存储的,这是一项很庞大的工程,后面还是需要将sql语句好好的在项目中再实践以下。对我来说,可能数据库这种课考个八九十没那么重要,但是我得熟悉它的用法,如果我能很好的使用,那60分我也能接受。

8.对model层的理解

说句实话,我到现在都不知道model层是干啥的,但是在建立本地数据库的时候我对model层的理解又更加的不同了。

一开始model层对我来说,就是进行json数据的解析。但是在从本地数据库获取信息解析的时候,我发现model的作用不仅是解析json数据,model层更是像一个大集合里的集合。它就像把一群人的共同属性抽象出来成为一个普遍的人,然后一群人里存储了不同属性的普通人。有点解释的抽象了。举个例子,{[1,2],[2,4],[4,8]},在这里,我把[2^n,2^(n+1)]可以当作一个model,然后在集合里存储了很多这种model。

这样是很方便的,这种方式很大程度上代码的可读性变高,而且节约了很多不必要的代码。相当于抽象出了一个类。

只是个人对model层做了那么久iOS开发的理解,暂时的理解。可能还不够准确,但是现在仿佛逐渐有了一个model层的概念,不再像以前那样,model层就是单纯的解析json数据。

因为只用了大概两周的时间,有很多东西熟悉的还不是很彻底,但是总某种程度上来说已经将一些基础的东西进行了整理和复习。 各种英文官方文档看的我是欲哭无泪。

下一步的学习重点在以下几点。

进一步的熟悉rac和研究mvvm模式的代码。

Masonry自动布局更复杂的情况。

Sql语句的更进一步使用。

还需要我自己去更多探索的是mjextension和blockskit。

另外还有想法看一些开源的代码和博客。不仅是开源控件的代码,还有开源的项目的代码。

另外,最近还在segmentfault上答题了,到不是为了找工作啥的,就像迪哥说的,这是一个很好的总结以前学过的东西的方式。

希望我亲爱的姐姐一直幸福。

其他没做什么了。

欢迎给我留言我们互相交流。

以上。