新项目的一些小思路

新项目开始也有一段时间了,由于工作以来几乎根本😫就没有大团队工作经验,所以关于架构方面的问题只能一点点慢慢摸索。虽说师傅领进门,修行在个人。但是有没有大项目经历,对工程的架构理解还是完全不一样的。下面是我新项目的一些思路,希望有不对的地方,还请及时指出,不吝感激。

工程的目录结构

项目基于的还是MVC架构。至于为什么不用VIP,MVVM嘛,我是不会说用的比较生,不敢在公司赶工的时候用的。

工程的目录结构

Mediator

组件化方案。采用的是Case的方案。关于组件化方案的目的与优势。

  1. 组件化方案可以使项目解耦。
  2. 可以通过URL调用特定页面。
  3. 可以使项目架构更清晰。

另外还有bang's blog蘑菇街 App 的组件化之路码农界吴彦祖三篇讲述组件化的方法。其实四个人将的从本质上来说相似。都是利用runtime的反射机制,转化为实例对象,这样可以根本上解耦。

Mediator组件化

由于APP为公司内部审批系统。所以部分页面的逻辑会紧密连接。中间件也就并没有像正常Mediator那样每个类都创建一个类别+Target。而是采用分模块化的形式体现。例如Target_ShowAlert模块看名字就能知道所有Alert形式的弹出框都依赖这个中间件。Target_Temporary用来处理登录相关的页面。Target_FormFlow则表示一条完整审批流程。可能以后会有其他的审批流程或者模块那就新建一个模块。

Network

采用的是YTKNetwork框架。

曾经一度挣扎在 自己封装&YTKNetwork&RTNetworking

首先是自己封装:,我认为小项目只有很少的网络需求的情况下是非常好的。因为开发速度快上手简单。但是面对较大项目的时候。就比较吃力了,尤其体现在接口管理和单元测试上。

YTKNetwork:目前认为最为省心的Network封装库了。几乎能想到的所有需求都能满足,无论是缓存、CDN、关键字替换。甚至加载中动画,都非常简单。强烈推荐。

RTNetworking:是对我影响最大的一个开源库,具体说明请看作者iOS应用架构谈 网络层设计方案

网络结构

YTKNetworking框架采用每个接口单独一个类的方式来实现。这样的好处是每一个接口都可以单独写一个单元测试,并且可以降低耦合。同时可以很方便的设置每个接口数据的转换,每个接口的缓存控制。非常一目了然,后续的开发也非常有条理。

做网络请求这一块遇到了一个问题,就是我们需要对返回数据进行统一的业务处理,比如说我们规定了state和stateMsg当遇到state=0时需要统一退出登录并跳转登录页面,这样的需求目前不知道YTKNetworking如何优雅的实现。目前我的实现方式有点剑走偏锋。是利用在接口都为Dictionary的情况下给字典添加一个统一处理的类别。

业务逻辑处理

内部实现的伪码为:

- (BOOL)isCorrectData {
    if (!self || ![self isKindOfClass:[NSDictionary class]]) {
        return NO;
    }
    //0:业务错误;1:成功;2:登录错误;3:系统链接错误
    switch ([self[@"state"] integerValue]) { 
        case ResponseDataStateTypeOperationError: {//业务错误
            if [self stateMessage] [Toast showError:[self stateMessage]];
            return NO;
        } break;
            
        case ResponseDataStateTypeSucceed: {//成功
            return YES;
        } break;
            
        case ResponseDataStateTypeLogInError: {//登录错误
            //跳转登录页面
            //showMessage
            return NO;
        } break;
            
        case ResponseDataStateTypeSystemError: {//系统链接错误
            //做一些特殊处理
            return NO;
        } break;
    
        default:
        //一些其他情况
            break;
    }
    return NO;
}

可以看出这样实现起来非常蹩脚。但是又一时间不知道如何不改变YTKNetworking固有框架的情况下实现这个功能。希望有相应经验的筒子们能指点指点啊。

Model

没有太多好说的,几乎所有的Model都是两个套路,要么Model只起到数据模型的作用,要么则是将部分逻辑从Controller中移植Model,即瘦Model和胖Model。

我目前比较倾向于胖Model,即将一些数据转换的活交给Model来实现,这样可以使得Controller的清洁。并且由于数据展示类型可能会重复,那么将这个转化方法提出为扩展。则似乎更符合代码规范。例如:一个展示列表中需要提供倒计时如4小时40分前。那么后台传给你的数据一定不会直接是这个string,而应该是一个时间戳NSTimeInterval类型这个类型实际上是double型数据,那么此时你的Model是应该提供何种类型的数据呢?是定义成

@property(nonatomic, assign) NSTimeInterval timeInterval;

还是

@property(nonatomic, copy) NSString *timeInterval;

亦或者

@property(nonatomic, strong) NSDate *issueTime;

相信大家也有自己的考量了。

View

这个用到了懒加载+autolayout,实话说在这里用懒加载我还是考虑了很久的,因为UI层不像Controller层,这里的控件基本上都是父控件加载的时候子控件就要创建了,并不存在懒加载的情况。之所以还是用懒加载的方式一方面是为了保持代码的一致性。另一方面也保证了代码的易读性。初始化的代码放在重写get方法中实在是一个不错的形式。特别对于有超过十个属性的时候,帮助特别大。修改的时候直接奔着目标get方法而去。

Controller

因为将许多代码从Controller中分离出去,所以Controller中显得格外干净。即使是里面包含tableview 包含筛选,包含下拉刷新上拉加载更多,包含搜索。一样可以很优雅的完成。具体请看TableView DataSource和delegate的分离。

Store

做的是所有和持久化存储相关的内容

本项目需要做的持久化并不多。其实就是利用一个快速读写文件类。然后每一个需要存储的部分创建一个类管理一个文件。进行存储归结档,并暴露出所需要的接口即可。更多需求可以参考YTK的存储

Libs

放的是一写第三方库。至于为什么不用现在炙手可热的Cocoapods,Carthage迦太基。主要是因为公司制度啊。月代码量+注释覆盖率+SVN让我归回原始。其实也没啥了。就是不能更新有点烦。

工程中使用的Libs

项目中使用的都是比较常见的第三方库。感谢开源者们:

CoreLock 手势密码开源库源码。我在其基础上根据自己的需求做了相应的修改:修改后的版本

GTMBase64 Base64编码库

MBProgressHUD 目前使用率最广的一款HUD+Message显示库了.

TouchIDManage自己写的关于使用TouchID的封装库。非常简单

YBDictionary2Model 自己写的将字典中的属性转化为property属性并输出到控制台的库

YYKit 目前最炙手可热的开源库之一了吧。使用了其中YYModel、YYText、YYImage 实在是太棒了。

IQKeyboardManager 一句话实现键盘弹出式动态上移的开源库

AFNetworking 目前最著名的objective-c网络开源库。(ASI由于MRC的原因逐渐的退出了舞台)

AFDownloadRequestOperation 非常棒的网络缓存开源库,YTKNetworking依赖库之一。

YTKNetworking 猿题库开源的最出名的网络库

MJRefresh目前还在更新的下拉刷新库

Masonry 伟大的开源库,算是纯代码autolayout必备库了。

SWTableViewCell 左滑出现快速处理模块的库,如果要兼容iOS7,这个库就灰常有必要了。

另外还有Notification,所有的通知都要通过这个类调用。这样就避免了通知写的太久忘记了有这个通知的事情了。(掩面而逃)

Toast项目中所有的加载动画。弹出信息都要经过这里包装。(不要问我为什么要脱裤子放屁,等你们突然决定要更换第三方库的时候就知道了)

category

包含了一些项目常用字体,颜色等类别

Common

包含一些通用类。目前只有

Foundation+log.m、正确显示汉字

LxDBAnything.h、快速打印啊

PrefixHeader.pch、关于PCH有很多人都在逐渐的抛弃。我也认为不应该什么类都往PCH中扔。但是完全舍弃对我来说反而降低了开发效率。我的PCH中只包含了#import "LxDBAnything.h"

UIDepend.h 引入了一些创建控件是需要的类,不需要将这些类导入到PCH中,那样会造成每个类都引入一次所所有头文件,造成编译效率降低。

#ifndef UIDepend_h
#define UIDepend_h

#pragma mark - FontSize


#import "UIColor+OAList.h"
#import "UIFont+OAList.h"

#import "UIView+YBAdd.h"
#import "UILabel+YBAdd.h"
#import "UIButton+YBAdd.h"
#import "UIScreen+YBAdd.h"

#import "Masonry.h"

#import "Toast.h"

#endif /* UIDepend_h */

Supporting Files

放置info.plist、Assets.xcassets、main.m


--by Queuey

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 目录: 该系列文章预计包括: 1 - 简介 2 - 连接以及连接过程解析 3 - 发送订阅消息以及发送过程 4 -...
    Codepgq阅读 1,675评论 7 3
  • 今天春分。微信好友的提示让我意识到踏青的季节到了,可抬眼望去,南京灰蒙蒙的天空,淫雨霏霏,气温不到10度,这让我想...
    天行健志强阅读 486评论 1 3
  • 枝头老鸦无处还, 东风彻夜话凄凉。 千里孤坟裹素妆, 万里河山影傲然。 酌酒默默赏雨寂, 漫天飘飘雪泪寒。 抬头问...
    君惜竹阅读 1,248评论 6 6