开发 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 模块的所有的接口都会放在这个文件中. 如
在 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 进行区分, 如
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/08be5b30ff82 .
来源: https://juejin.im/post/5c04fb8a518825689f1b46f0