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_htypedef 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 LOCALvalidEnvironment=developer;#elsevalidEnvironment=product;#endifNSString *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
转载于:https://www.cnblogs.com/wujy/p/5104111.html
IOS整体项目层级构建相关推荐
- iOS 整体项目竖屏 相机横屏
//横屏方法: AppDelegate.m 中添加监听 //监听页面翻转 [[NSNotificationCenter defaultCenter]addObserver:self selector: ...
- SwiftUI iOS 完整项目之基于CoreData构建购物计划App(教程含源码App Store上线app)
实战需求 SwiftUI iOS 完整项目之基于CoreData构建购物计划App(App Store上线app) 用我们从超市需要的东西来代替我们口袋里的废纸.只需输入您想要的项目.数量.任何额外备 ...
- GitHub 上都有哪些值得关注学习的 iOS 开源项目?
GitHub 上都有哪些值得关注学习的 iOS 开源项目?修改 如果仅按照 GitHub 月流行查看 Objective-C 项目的话有 ── Trending Objective-C reposit ...
- 直接拿来用!最火的iOS开源项目
摘要:iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7,有的项目已被弃用,有的则继续发扬光大,新项目更是层出不穷.在本文中,我们将继续为大家介绍20个在GitHub ...
- 直接拿来用!最火的iOS开源项目(二)
每一次的改变总意味着新的开始."这句话用在iOS上可谓是再合适不过的了.GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iO ...
- iOS开源项目周报0323
由OpenDigg 出品的iOS开源项目周报第十三期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. CHIPag ...
- (转)直接拿来用!最火的iOS开源项目(一)
2019独角兽企业重金招聘Python工程师标准>>> 1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNet ...
- GitHub上最火的40个iOS开源项目(二)
http://www.open-open.com/lib/view/open1388316950609.html GitHub上最火的40个Android开源项目(一) GitHub上最火的40个An ...
- GitHub上最火的40个iOS开源项目(一)
http://www.open-open.com/lib/view/open1388317004500.html 在结束了GitHub平台上"最受欢迎的Android开源项目"系列 ...
- GitHub上最火的40个iOS开源项目
1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...
最新文章
- Postgresql相关数据库、表占用磁盘大小统计
- 数据库报错1046-No database selected
- 【PC工具】图片压缩哪家强!tinyPNG图片压缩工具
- 【深度学习】相当全面的深度学习环境配置指南!(Windows、Mac、Ubuntu全讲解)...
- Python回调函数
- 从JDBC ResultSet创建对象流
- Linux常用基本命令:三剑客命令之-awk内置函数用法
- Python基础篇【第二篇】:运算符
- Observer模式(观察者设计模式)
- 【花式】基于matlab花圣诞树【含Matlab源码 001期】
- iptables基础(01)
- 恒生电子笔试(笔试流程,笔试介绍,题型,以往笔试题)
- 2017存钱计划(python实现)
- 关于Mac系统 使用npm i xxx的时候 报错
- 如何网络推广快,怎么快速推广网站
- WiFi安全现状,70%的WiFi可被快速破解
- (转)程序员成功之路 ——The road ahead for programmer(演讲稿)
- 算法 散列1 电话聊天狂人
- 安卓Hook微信-计步器、万能骰子、自动回复、反撤回、抢红包思路分享
- Mock模拟数据测试一:使用fiddler mock response数据
热门文章
- 如何在 Mac 上重命名 Apple Magic Mouse?
- Capture One Pro 22 for Mac(RAW图像处理软件)v15.1.2.1
- 如何用键盘快捷键打开 macOS 控制中心?
- Mac电脑上的Safari运行缓慢,卡的要死,该怎么解决?
- 三数之和,去除重复。
- (转)Scala中协变(+)、逆变(-)、上界(:)、下界(:)简单介绍
- 使用php的curl根据关键词爬取百度搜索结果页
- HDU 1203 I need a offer! (01背包)
- 7月11日安全沙龙演讲主题漏洞与网站挂马
- 华为Java开发编程最新军规,谁违反谁滚蛋!