当前位置: 首页 > news >正文

iOS 工程组织结构分享

开发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模块的所有的接口都会放在这个文件中。如

在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进行区分,如

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代码编程规范-根据项目经验汇总.

相关文章:

  • 我的工具:Ping工具
  • BZOJ1061 NOI2008 志愿者招募
  • 设计模式应用举例
  • 【刘文彬】区块链 + 大数据:EOS存储
  • 【DP】【CF855C】 Helga Hufflepuff's Cup
  • 如何更高效的拼接字符串?
  • C# 多线程六之Task(任务)三之任务工厂
  • 整数规划---整数规划问题的提出
  • React+TypeScript入门
  • MySql行转列、列转行
  • @ModelAttribute注解使用
  • docker容器内的网络抓包
  • 【linux】linux重启tomcat + 实时查看tomcat启动日志
  • JavaScript基础——基本概念
  • 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
  • 345-反转字符串中的元音字母
  • crontab执行失败的多种原因
  • ES6核心特性
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • python_bomb----数据类型总结
  • Quartz初级教程
  • React-redux的原理以及使用
  • React-生命周期杂记
  • Windows Containers 大冒险: 容器网络
  • 从输入URL到页面加载发生了什么
  • 后端_MYSQL
  • 一道闭包题引发的思考
  • 一天一个设计模式之JS实现——适配器模式
  • 智能合约开发环境搭建及Hello World合约
  • 转载:[译] 内容加速黑科技趣谈
  • ionic入门之数据绑定显示-1
  • kubernetes资源对象--ingress
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​如何在iOS手机上查看应用日志
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #vue3 实现前端下载excel文件模板功能
  • (2)MFC+openGL单文档框架glFrame
  • (6)STL算法之转换
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • **python多态
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET : 在VS2008中计算代码度量值
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net core 6.0 升8.0
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net IOC框架入门之一 Unity
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 的字符串暂存池
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • @property @synthesize @dynamic 及相关属性作用探究
  • [145] 二叉树的后序遍历 js