iOS 工程组织结构分享

作者: 蝴蝶之梦天使 | 来源:发表于2016-04-07 17:32 被阅读1183次
Structure.png
开发iOS项目已经有几十个,对iOS的工程组织结构有一些经验和大家分享下。并写了一个Demo, 请参考 https://github.com/yinanwang1/Structure.git

1. 使用cocoaPod进行第三方库的管理

常用的第三方库

platform :ios, '7.0'

target 'Structure' do

pod 'AFNetworking', '~> 2.5.4'
pod 'SDWebImage', '~> 3.7.5'
pod 'JTObjectMapping', '~> 1.1.2'
pod 'XTSafeCollection', '~> 1.0.3'
pod 'Masonry', '~> 0.6.4'

end

其中的XTSafeCollection推荐使用,避免数组越界引起的crash。

2. 网络层

(1)AFNetworking的封装

对Afnetworking进行一次封装

+ (AFHTTPSessionManager *)sharedClient;

+ (NSURLSessionDataTask *)postRequest:(NSString*)path
                          parameters:(id)parameters
                            encToken:(NSString*)encToken
                             isLogin:(BOOL)isLogin
                             success:(void (^)(ErrorCode status, NSString * msg, NSDictionary * data))success
                             failure:(void (^)(ErrorCode status, NSString *msg, NSDictionary * data))failure;

+ (NSURLSessionDataTask *)getRequest:(NSString*)path
                         parameters:(NSDictionary*)parameters
                           encToken:(NSString*)encToken
                            isLogin:(BOOL)isLogin
                            success:(void (^)(ErrorCode status, NSString * msg, NSDictionary * data))success
                            failure:(void (^)(ErrorCode status, NSString *msg, NSDictionary * data))failure;

+ (NSURLSessionDataTask *)uploadRequest:(NSString*)path
                            parameters:(NSDictionary*)parameters
                              encToken:(NSString*)encToken
                         formDataArray:(NSArray *)formDataArray
                               isLogin:(BOOL)isLogin
                               success:(void (^)(ErrorCode status, NSString * msg, NSDictionary * data))success
                               failure:(void (^)(ErrorCode status, NSString *msg, NSDictionary * data))failure;

+ (NSURLSessionDataTask *)putRequest:(NSString*)path
                         parameters:(NSDictionary*)parameters
                           encToken:(NSString*)encToken
                            isLogin:(BOOL)isLogin
                            success:(void (^)(ErrorCode status, NSString * msg, NSDictionary * data))success
                            failure:(void (^)(ErrorCode status, NSString *msg, NSDictionary * data))failure;

+ (NSURLSessionDataTask *)deleteRequest:(NSString*)path
                            parameters:(NSDictionary*)parameters
                              encToken:(NSString*)encToken
                               isLogin:(BOOL)isLogin
                               success:(void (^)(ErrorCode status, NSString * msg, NSDictionary * data))success
                               failure:(void (^)(ErrorCode status, NSString *msg, NSDictionary * data))failure;

在sharedClient中创建一个AFHTTPSessionManager,并封装了Get,Post,Upload,Put和Delete几个类方法,进行HTTP的基本请求操作。

(2)WebService 的使用

假设有一个接口#define URL_TEST @"test"需要进行网络获取,那么创建一个ChatsModel.h的文件,这个文件主要是将Chats模块的所有的接口都会放在这个文件中。如

Model.png
在ChatsModel文件中创建方法- (void)fetchData:(void (^)(ErrorCode status, NSString *messageStr, ChatsEntity *chatesEntity))compelte;进行网络获取。

(3)Entity的转化

将Json转化为Model使用JTObjectMapping的第三方库,当然也可以用Mantle。将从服务器返回的数据直接转化为Model。Model中有2个实例变量

@property (nonatomic, strong) NSString *nameStr;
@property (nonatomic, strong) NSNumber *ageIntNum;

创建一个方法进行类型的转换

+ (instancetype)createChatsEntityWithDic:(NSDictionary *)dic
{
    NSDictionary *mapping = @{
                              @"name": @"nameStr",
                              @"age":@"ageIntNum",
                              };
    
    ChatsEntity *entity = [ChatsEntity objectFromJSONObject:dic
                                                    mapping:mapping];
    
    return entity;
}

3. 组织结构

关于组织结构,一定要打开项目的文件夹,手动先创建每层的文件夹,再将文件夹Add到project中,这样有一个好处是Xcode中显示的文件夹和Finder显示的保持一致。不然Finder中看到的文件是全部放在Structure文件夹中,不方便阅读。

(1)Macros

宏定义一般创建4个文件:
<1>URL.h 将网络访问需要使用的URL宏定义在这个文件中。如#define SERVER_URL @"http://www.baidu.com".
<2>Keys.h 将需要用的Key放在这个文件,如微信,微博,shareSDK等。
<3>Macros.h 将项目中用到并且是全局要用到的Enumeration放在这个文件中,方便调用也可以避免重复定义。如

typedef enum
{
    //未知错误
    kUnknownError = -1,
    
    kNoError = 0,
    
    kNetWorkError = 1,
    
}ErrorCode;

<4>UserDefaultAndNotification.h 将通知和保存到User Default中的Key保存到这个文件,方便统一管理Keys,避免重复定义引起异常错误。
<5>Utilities.h 将定义的工具宏统一放在这个文件中,常见的DLog等。

(2)MVCs

业务相关的文件,根据模块分开,每一个模块中再依据MVC进行区分,如


MVCs.png

Chats文件夹是聊天的模块,
<1>其中的ViewController.h/.m是Chats的根Controller。
<2>Model文件夹对应M层,并包含了Entity的文件夹,进行Json转Model。
<3>Views文件夹对应MVC中的V层。

(3)Utilities

将在每一个模块中,需要使用到UIKit或算法,可以抽出来放在文件中,如自定义的AlertView货Share。

(4)Base

定义一些基础的类,如UIViewController,UINavigationController。根据APP的需求将通用的颜色,加载视图等放在这个文件夹中。

(5)External

第三方库的文件,有些第三方库没有在Cocoapod上,那么将文件Copy到这个文件夹中,尽量不要修改第三方库的文件,可以创建第三方库的category来扩展功能。

(6)Resources

放图片,plist等资源文件。

(7)PrefixHeader.pch

将很多类中都需要使用的头文件,放在这个文件中。免得在一个class文件中都添加一次相同的头文件。

代码规范可以参考iOS代码编程规范-根据项目经验汇总.

相关文章

网友评论

  • 着魔的毛豆:http://www.jianshu.com/p/3beb21d5def2 看看这个 挺好的
    蝴蝶之梦天使:@着魔的毛豆 http://casatwy.com/iosying-yong-jia-gou-tan-viewceng-de-zu-zhi-he-diao-yong-fang-an.html 这个文章也写的不错,可以看看
    小马飞驰bnb:@着魔的毛豆 我也拜读了,确实是很好的文章。虽然不想承认,但也不得不承认——比我的框架好多了...作者解决了很多我一直想解决但又一直没能解决的问题。非常感谢分享。
    蝴蝶之梦天使:@着魔的毛豆 好的,谢谢
  • 小马飞驰bnb:我也对AFNetworking做了类似的封装,不过没有isLogin和encToken参数,请问楼主加这两参数是处于什么考虑呀?
    蝴蝶之梦天使:@maruipp 好的,谢谢
    小马飞驰bnb:@蝴蝶之梦天使 建议楼主把它做通用一些,把业务逻辑分出去,方便以后复用。
    蝴蝶之梦天使:@maruipp isLogin和encToken是我们项目中使用的。使用isLogin和encToken来判断是否需要进行重登陆,然后再进行获取数据。 这个重登陆操作也可以放到调用接口前。

本文标题:iOS 工程组织结构分享

本文链接:https://www.haomeiwen.com/subject/dcyjlttx.html