iOS 工程組織結構分享

_阿南_發表於2018-12-05

Structure.png
開發iOS專案已經有幾十個,對iOS的工程組織結構有一些經驗和大家分享下。並寫了一個Demo, 請參考 github.com/yinanwang1/…

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程式碼程式設計規範-根據專案經驗彙總.

相關文章