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