开发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进行区分,如
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代码编程规范-根据项目经验汇总.
网友评论