IOS整體項目層級構建

来源:http://www.cnblogs.com/wujy/archive/2016/01/06/5104111.html
-Advertisement-
Play Games

在創建IOS項目時,若有一個比較明確的層級架構,將對於今後代碼的維護或者功能的擴展很有幫助;本文將通過一個實例來展現我對於層級的一些觀點;裡面有一些零碎的知識點可能無法全部介紹,到時提供源代碼進行下載,也希望有其它更好的觀點可以提出來;一:首先瞭解整個項目的情況註意:項目中結合Pod進行一些第三方插...


在創建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

 

源代碼已上傳到GitHub,大家可以一起完善,地址:https://github.com/wujunyang/MobileProject


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.資料庫設計的概念資料庫設計是將資料庫中的數據實體及這些數據實體之間的關係,進行規劃和結構化的過程.二.資料庫設計的重要性如果一個資料庫沒有進行一個良好的設計,那麼這個資料庫完成之後他的缺點是:1.效率會很低2更新和檢索數據時會出現很多問題,反之,一個資料庫被盡心策划了一番,具有良好的設計,那他的...
  • 因為用了一個安全平臺。此平臺居然不支持oracle中的服務嗎有”.”而這個點就是因為當時安裝oracle錄入了域。原來以為是修改服務名。百多了很多,最後發現就是刪除域即可 感謝此文:http://blog.csdn.net/viszl/article/details/7787528 最終是按此文解決...
  • 工作中經常遇到針對業務部門提出不同時間粒度(年、季度、月、周、日等等日期時間粒度,以下簡稱時間粒度)的數據統計彙總任務,也看到不少博友針對這方便的博文,結合SQL Server的日期時間函數和MySQL的日期時間函數,我將嘗試闡述不同的時間粒度以及其在項目中的使用,談到時間當然也會提到日期維度(.....
  • package com.zzw.drawable;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;imp...
  • 通過繪圖只是將驗證碼/密碼繪製到指定區域,實現驗證碼/密碼的按位輸入。
  • 一,效果圖。二,工程圖。三,代碼。RootViewController.h#import @interface RootViewController : [email protected]#import "RootViewController.h"@in...
  • #import "ViewController.h"@interface ViewController ()@property (nonatomic,strong) UITextField *tf;@end@implementation ViewController- (void)viewDidLo...
  • 最近換了新電腦,裝上Xcode敲代碼發現很多以前攢的Code Snippet忘記備份了,總結了一下Code Snippet的設置方法,且行且添加,慢慢積累吧。如下圖:Title - Code Snippet標題Summary -Code Snippet摘要Platform -Code Snippet...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...