iOS-组件化

当项目越来越复杂的时候,平时的通用方案就不太实用了,这个时候就需要对项目组件化了。 组件化这个东西其实并不复杂,本质上是一种app架构思路。

iOS-组件化

目录:


本地私有库

创建一个文件夹,并在这个文件夹下执行命令:

pod lib create XXXX (XXXX为你准备创建的库的名字)

然后完成选项,即可创建完一个本地库。

然后将需用的代码文件,添加到对应的文件夹中,并删除ReplaceMe.m文件

最后一步,cd 到库中的Example文件下,然后pod install下,更新Example项目的pod,步骤完成。

远程私有库

找到库的podSpec文件,并完成相应的修改。

同时创建远程代码库(比如GitHub),将相应的代码提交至这个代码库。

前往文件夹 ~/.cocoapods/repos
打开终端,在终端切换到当前目录下,然后进行pod repo add操作
在终端输入:
pod repo add XHMSpec https://github.com/xxxx.git(远程Spec仓库的地址)

向私有的spec Repo远程仓库中提交podspec.

1
2
# pod repo push [Repo名] [podspec 文件名字]
$ pod repo push SEASpec Test.podspec

然后就可以在项目中使用了:

1
2
source 'https://github.com/seabrea/SEASpec.git'
pod 'LocalPrivateLibrary'

总结:设置两个远程库,一个作为Specs文件库,一个作为代码库,并处理好两者关系。项目使用时的Source使用的是Specs的git地址。

组件化方案

由于项目开发时间变长后,项目各个业务,各个类直接的互相引用会增多。整个项目的也会变得越来越臃肿,结构也开始不清晰。这个时候则要开始对项目组件化了。

讲各个业务模块和基础课拆分成一个一个组件,每个组件是 独立的业务或者功能单位。组件则使用CocoPods来管理。

Target - Action

那么,为了做到解耦,组件间的调用则是一个大问题。现在比较火热的方案则是 CTMediator

CTMediator让组件之间放弃直接调用。同一个Mediator(中间件)来处理这个问题。

为了应对解耦问题,使用了Target - Action+runtime的方式。

以模块A调用模块B为例。

首先为被调用方(模块B),添加一个类,用于target-action处理。

1
2
3
4
5
6
7
8
9
10
/*
* 创建一个 Target_XXXX 的类
* 类中提供一个 Action_XXXXX 的方法用于外部接口
*/

@interface Target_B : NSObject

- (UIViewController *)Action_NavigationViewController:(NSDictionary *)params;

@end

而在这个类中,可以自由的使用#import来获取需要的对象。(模块内部-高内聚,模块外部-低耦合)

1
2
3
4
5
6
7
8
9
10
#import "Target_B.h"
#import "BViewController.h"

@implementation Target_Shop

- (UIViewController *)Action_NavigationViewController:(NSDictionary *)params {
return [[BViewController alloc] init];
}

@end

随后为中间件添加一个分类,方便调用方调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
#import "CTMediator+BViewController.h"

NSString * const TargetVCName = @"B";
NSString * const TargetActionName = @"NavigationViewController";

@implementation CTMediator (BViewController)

- (UIViewController *)mediator_ShopViewController {
UIViewController *vc = [self performTarget:TargetVCName action:TargetActionName params:nil shouldCacheTarget:NO];
return vc;
}

@end

分类中,使用CTMediator来查询到Target-Action服务类,来完成调用模块B(本质上使用runtime找到target类,并向类中的action方法发送消息)。

总结:

  • 优点:target-action方法的确可以做到高度解耦,完成组件化。
  • 缺点:组件增多后,中间件会变得非常臃肿,使用上也会避免麻烦。
iOS内存管理与多线程 iOS-剖析UIView

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×