你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS整體項目層級構建

IOS整體項目層級構建

編輯:IOS開發綜合
  • 在創建IOS項目時,若有一個比較明確的層級架構,將對於今後代碼的維護或者功能的擴展很有幫助;本文將通過一個實例來展現我對於層級的一些觀點;裡面有一些零碎的知識點可能無法全部介紹,到時提供源代碼進行下載,也希望有其它更好的觀點可以提出來;

    一:首先了解整個項目的情況

    注意:項目中結合Pod進行一些第三方插件的管理,項目中已經把幾個比較常用的第三方進行引用;因為上面幾個都是比較常見的第三方插件,就不在這邊詳細介紹,關於如何使用Pod可以通過網上其它資料進行了解;對於如何一個項目創建多個Tag的知識也可以網上搜索;當然你也可以點擊這邊查看;

    二:主項目的分層情況

    注意:主項目中的分層主要包含四個模塊,Main(主要)、Expand(擴展)、Resource(資源)、Vender(第三方),還有本項目是有多個Tag,用於區分不同的版本,比如本地環境測試版、產品版,主要是通過Tag來區分,不同的標識對應不同的連接地址;當然也可以設置其它不同的內容;

    2.1 Main(主要)模塊的內容

    此模塊主要目的是為了存放項目的頁面內容,比如MVC的內容,Base(基類)用於存放一些公共的內容,其它功能模塊的提取,方便繼承調用;在本實例中已經在BaseController整理的一個公用的ViewController

    2.2 Expand(擴展)模塊的內容

    此模塊主要包含Const、Macros、Tool、NetWork、Category、DataBase六個子模塊;

    2.2.1 Macros(宏)主要存放宏定義的地方,這邊有兩個宏文件,Macros.h主要是項目的一些主要宏,比如字體、版本、色值等,而ThirdMacros.h主要用於存放一些第三放SDK的key值;

    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

    1. 上一頁:
    2. 下一頁:
    蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
    Copyright © Ios教程網 All Rights Reserved