在建立IOS項目時,如有一個比較明確的層級架構,將對於從此代碼的維護或者功能的擴展頗有幫助;本文將經過一個實例來展示我對於層級的一些觀點;裏面有一些零碎的知識點可能沒法所有介紹,到時提供源代碼進行下載,也但願有其它更好的觀點能夠提出來;html
一:首先了解整個項目的狀況git
注意:項目中結合Pod進行一些第三方插件的管理,項目中已經把幾個比較經常使用的第三方進行引用;由於上面幾個都是比較常見的第三方插件,就不在這邊詳細介紹,關於如何使用Pod能夠經過網上其它資料進行了解;對於如何一個項目建立多個Tag的知識也能夠網上搜索;固然你也能夠點擊這邊查看;github
二:主項目的分層狀況網絡
注意:主項目中的分層主要包含四個模塊,Main(主要)、Expand(擴展)、Resource(資源)、Vender(第三方),還有本項目是有多個Tag,用於區分不一樣的版本,好比本地環境測試版、產品版,主要是經過Tag來區分,不一樣的標識對應不一樣的鏈接地址;固然也能夠設置其它不一樣的內容;架構
2.1 Main(主要)模塊的內容ide
此模塊主要目的是爲了存放項目的頁面內容,好比MVC的內容,Base(基類)用於存放一些公共的內容,其它功能模塊的提取,方便繼承調用;在本實例中已經在BaseController整理的一個公用的ViewController工具
2.2 Expand(擴展)模塊的內容測試
此模塊主要包含Const、Macros、Tool、NetWork、Category、DataBase六個子模塊;字體
2.2.1 Macros(宏)主要存放宏定義的地方,這邊有兩個宏文件,Macros.h主要是項目的一些主要宏,好比字體、版本、色值等,而ThirdMacros.h主要用於存放一些第三放SDK的key值;ui
2.2.2 Tool(工具類)主要存放一些經常使用的類,此處Logger用於存放日誌的封裝幫助類,Reachability用於存放判斷網絡狀態的幫助類;
2.2.3 Network(網絡)這邊主要用到YTKNetwork 是猿題庫 iOS 研發團隊基於 AFNetworking 封裝的 iOS 網絡庫,這邊是對它進行一些修改,爲了知足不一樣Tag及不一樣的功能模塊可能訪問不一樣URL的要求;
2.2.4 Category(分類)主要用到Git上面iOS-Categories分類的內容,多建立一個Other用於存放平時要擴展的分類;
2.3 Resource(資源)模塊的內容
資源模塊主要包含三方面,Global(全局)、Image(圖片)、Plist(配置文件);
2.3.1 Global用於存放項目一些全局的內容,包含啓動項的內容LaunchScreen.storyboard、頭部引用PrefixHeader.pch、語言包File.strings
2.3.2 Image用於存放圖片資源,能夠根據功能模塊進行再分不一樣的xcassets文件;
2.3.3 Plist用於存放plist文件,主要是本項目中會建立多個的Tag,而每一個Tag都會有自個的plist文件進行管理,因此統一存放方便管理;
2.4 Vender(第三方)模塊的內容
雖然項目中已經用Pod來管理第三方插件,但對於一些可能要進行修改的第三方能夠存放在這邊,本實例中引用的幾個比較經常使用的第三方插件,簡單介紹其中的幾個,GVUserDefaults是對UserDefaults的封裝,簡單就能夠用於存取操做;JDStatusBarNotification是在狀態欄提示效果的插件;ActionSheetPicker底部彈出如時間選擇、選項的插件;QBImagePickerController是照片選擇插件,支持多選並能夠設置最多選擇張數;
三:Network(網絡)介紹
由於項目中關於Network的運用比較多,本實例又對它進行的修改,這邊就單獨進行講解;首先分享兩個介紹關於YTKNetwork知識的鏈接地址;
YTKNetwork 使用基礎教程
https://github.com/yuantiku/YTKNetwork/blob/master/BasicGuide.md
YTKNetwork 使用高級教程
https://github.com/yuantiku/YTKNetwork/blob/master/ProGuide.md
在針對每一個請求時,本實例又增長一個訪問類型,用於區分對應的鏈接前綴
#ifndef NetWorkEnvironment_h #define NetWorkEnvironment_h typedef NS_ENUM(NSInteger,SERVERCENTER_TYPE) { ACCOUNT_SERVERCENTER, PICTURE_SERVERCENTER, BUSINESSLOGIC_SERVERCENTER, UPDATEVERSION_SERVERCENTER }; #endif /* NetWorkEnvironment_h */
#import "NetWorkBaseUrlConfig.h" static NSString *const developer = @"developer"; static NSString *const product = @"product"; static NSString *const ACCOUNT_SERVERCENTER_Key=@"ACCOUNT_SERVERCENTER"; static NSString *const PICTURE_SERVERCENTER_key=@"PICTURE_SERVERCENTER"; static NSString *const BUSINESSLOGIC_SERVERCENTER_key=@"BUSINESSLOGIC_SERVERCENTER"; static NSString *const UPDATEVERSION_SERVERCENTER_key=@"UPDATEVERSION_SERVERCENTER"; @interface NetWorkBaseUrlConfig() @property(nonatomic ,assign) SERVERCENTER_TYPE netType; @property(nonatomic ,strong) NSMutableDictionary *configDictionary; //開發測試環境 @property(nonatomic ,strong) NSDictionary *develpoerDictionary; //產品環境 @property(nonatomic ,strong) NSDictionary *productDictionary; @end @implementation NetWorkBaseUrlConfig +(instancetype)shareconfig { static id share; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ share = [[NetWorkBaseUrlConfig alloc] init]; }); return share; } -(id)init { if (self == [super init]) { //測試環境 self.develpoerDictionary=@{ACCOUNT_SERVERCENTER_Key:@"http://private-eda65-mock.com/",PICTURE_SERVERCENTER_key:@"圖片前綴",BUSINESSLOGIC_SERVERCENTER_key:@"業務邏輯前綴",UPDATEVERSION_SERVERCENTER_key:@"版本升級前綴"}; //產品環境 self.productDictionary=@{ACCOUNT_SERVERCENTER_Key:@"http://private-eda66-mock.com/",PICTURE_SERVERCENTER_key:@"圖片前綴",BUSINESSLOGIC_SERVERCENTER_key:@"業務邏輯前綴",UPDATEVERSION_SERVERCENTER_key:@"版本升級前綴"}; self.configDictionary = [NSMutableDictionary dictionary]; [self.configDictionary setObject:self.develpoerDictionary forKey:developer]; [self.configDictionary setObject:self.productDictionary forKey:product]; } return self; } -(NSString*)urlWithCenterType:(SERVERCENTER_TYPE)type { NSString *urlResult=@""; NSString *validEnvironment = @""; //過濾不一樣Tag #ifdef LOCAL validEnvironment=developer; #else validEnvironment=product; #endif NSString *urlKey = @""; switch (type) { case ACCOUNT_SERVERCENTER: urlKey = ACCOUNT_SERVERCENTER_Key; break; case PICTURE_SERVERCENTER: urlKey = PICTURE_SERVERCENTER_key; break; case BUSINESSLOGIC_SERVERCENTER: urlKey = BUSINESSLOGIC_SERVERCENTER_key; break; case UPDATEVERSION_SERVERCENTER: urlKey = UPDATEVERSION_SERVERCENTER_key; break; default: break; } urlResult = self.configDictionary[validEnvironment][urlKey]; return urlResult; } @end
注意:#ifdef LOCAL 就是區分不一樣的Tag標識,此項目把本地測試的Tag標識定爲LOCAL,而後在每一個請求中設置其要訪問的類型;
ACCOUNT_SERVERCENTER(登陸地址前綴),PICTURE_SERVERCENTER(圖片地址前綴),BUSINESSLOGIC_SERVERCENTER(業務邏輯前綴),UPDATEVERSION_SERVERCENTER(版本升級前綴)
develpoerDictionary(測試),productDictionary(產品)用於存放不一樣的鏈接前綴地址,如有其它版本的Tag就要再建立相應的字典;
#import "LogInApi.h" @interface LogInApi() { NSString *_username; NSString *_password; } @end @implementation LogInApi - (id)initWithUsername:(NSString *)username password:(NSString *)password { self = [super init]; if (self) { _username = username; _password = password; } return self; } - (NSString *)requestUrl { return @"user/login"; } - (YTKRequestMethod)requestMethod { return YTKRequestMethodPost; } -(SERVERCENTER_TYPE)centerType { return ACCOUNT_SERVERCENTER; } - (id)requestArgument { return @{ @"user_name": _username, @"user_password": _password }; } @end
此處設置訪問的前綴爲ACCOUNT_SERVERCENTER類型的地址
LogInApi *reg = [[LogInApi alloc] initWithUsername:@"username" password:@"password"]; [reg startWithCompletionBlockWithSuccess:^(YTKBaseRequest *request) { NSLog(@"狀態碼%ld",request.responseStatusCode); LoginModel *model=[[LoginModel alloc]initWithString:request.responseString error:nil]; NSLog(@"響應內容:%@",model.access_token); } failure:^(YTKBaseRequest *request) { NSLog(@"Error"); }];
調用上面那個Api的操做內容;並對還回內容進行JSONModel轉換;
其它內容導航:
IOS比較經常使用的第三方及實例(不斷更新中) 地址:http://www.cnblogs.com/wujy/p/4747998.html
IOS開發基礎知識碎片-導航 地址:http://www.cnblogs.com/wujy/p/4571611.html
源代碼已上傳到GitHub,你們能夠一塊兒完善,地址:https://github.com/wujunyang/MobileProject