菜单

iOS组件化方案-计算第二篇

2019年9月13日 - Php

近一年iOS产业界研究组件化方案吗多,概略来讲有3种。

那是iOS组件化方案-计算的第二篇,在本文中自己达成了Target-Action方案的德姆o,并与第一篇介绍的protocol方案做出相比

设若未有看过小编先是篇protocol组件化方案的同室,能够先去下载作者那篇小说中提供的德姆o,方便了然自身本文的前述以及领会自个儿德姆o中落到实处的作业场景,传送门iOS组件化方案-计算的首先篇

USportageL注册方案据自个儿询问比非常多大厂商都在选择,复蕈街 App
的组件化之路香菇街的Limboy在那篇博客中做了很详细的演讲

国际惯例先上德姆o(下载主工程就好了哈,假使不可能明了能够把富有业务模块都下载下来,Casa也提供了法定德姆o,我第一篇作品中提供了传送门)

Target-Action runtime调用方案Casa在 iOS应用架构谈
组件化方案中也做了很详细的陈述,前阵时间Casa开了一篇博客在现成工程中执行基于CTMediator的组件化方案清楚陈述了哪些用那套方案实践组件化

Target-Action方案主工程

Protocol方案小编未曾看到有人做过详尽的分享,可能是自身一孔之见,可是在那边,作者会教大家用Protocol方案施行组件化,不唯有如此..

Target-Action方案商品详细情形业务Category组件地址

我会采取上述3种方案详尽的落到实处3个德姆o,德姆o会在文尾给到,本文然而多演说3种方案的高低,小编会在最后做多个总括,希望给想通晓组件化方案的同桌或然给在档案的次序中图谋进行组件化方案的同室提供八个借鉴。

Target-Action方案商品详细情形业务模块地址

其次篇 也已经出来了传送门iOS组件化方案-总计第二篇

Target-Action方案确认订单Category组件地址

业务模拟场景

把作业连贯起来 点击首页中A商品,进入A商品的商品详情页
,点击商品详情页中的 当下购买
进入确认订单页,点击确认订单页中的交付订单
会重返到商品详情页,并且在商品详情页中告知客户下单成功.

真实专业场景下确认订单页交给订单
是不会回去商品详情页的,模拟那个境况是想在德姆o中贯彻2个模块中反向回调。

Target-Action方案确认订单业务模块地址

一、Protocol注册方案

标准实施前先奉上Demo,提出只下二个主项目就足以了(注:下载完不须求pod
install恐怕pod update,pods在自家私有源上
作者平昔不填写.gitignore文件,下载完都以足以一向跑的)

主项目地址

商品详细情况业务接口组件地址

商品详细的情况业务组件地址

鲜明订单业务接口组件地址

肯定订单业务组件地址

事情调治中间件地址

CRProtocolManagerMGJRouterCTMediator同等属于模块之间调整的中间件

CRProtocolManager品种下创办名称叫CRProtocolManager的文件夹,前面我们需求做成私有pod的文书均位居该文件夹下。

创建CRProtocolManager类,定义2个对外接口

@interface CRProtocolManager : NSObject+ registServiceProvide:provide forProtocol:(Protocol*)protocol;+ serviceProvideForProtocol:(Protocol *)protocol;@end

具体方法完毕很简短能够参照德姆o,笔者这里只是轻巧管理。接下来正是要把品种交由到gitHub,做个人pod了

万里长征终于走完第一步,基础设备一度构建实现

既然组件化了,那我们全数的作业模块都以单身的project,但是此间小编会分2个project,三个是物品实际情况职业入口模块,二个是货品详细情况业务模块。工作入口模块正是定义该模块对外提供工作接口的protocol,如若A模块须求调用到B模块,那A模块只须求引进CRProtocolManager和B模块的protocol,并非引进整个B模块。

新建三个projectCRGoodsDetailServiceProtocol,创制八个和项目名一样的protocol文件,定义接口如下

@protocol CRGoodsDetailServiceProtocol <NSObject>@required;- (UIViewController *)goodsDetailViewControllerWithGoodsId:(NSString*)goodsId goodsName:(NSString *)goodsName;@end

参照CRProtocolManager做成私有pod

上述实践实现,新建贰个projectCRGoodsDetail,新建2个类

CRGoodsDetailServiceProvideCRGoodsDetailViewController

CRGoodsDetailServiceProvide即是CRGoodsDetailServiceProtocol的实现者
所以他依附CRGoodsDetailServiceProtocol,因为货色详细情形模块需求跳转到订单确认页,所以她也凭借CRProtocolManager

充足Podfile文件编写如下

source 'https://github.com/sun6boys/CRRepositories.git'source 'https://github.com/CocoaPods/Specs.git'target 'CRGoodsDetail' dopod "CRProtocolManager"pod "CRGoodsDetailServiceProtocol"end

执行pod install --verbose --no-repo-update

最终CRGoodsDetailServiceProvide落实代码如下

#import "CRGoodsDetailServiceProvide.h"#import <CRGoodsDetailServiceProtocol/CRGoodsDetailServiceProtocol.h>#import <CRProtocolManager/CRProtocolManager.h>#import "CRGoodsDetailViewController.h"@interface CRGoodsDetailServiceProvide()<CRGoodsDetailServiceProtocol>@end@implementation CRGoodsDetailServiceProvide+ load{ [CRProtocolManager registServiceProvide:[[self alloc] init] forProtocol:@protocol(CRGoodsDetailServiceProtocol)];}- (UIViewController *)goodsDetailViewControllerWithGoodsId:(NSString*)goodsId goodsName:(NSString *)goodsName{ CRGoodsDetailViewController *goodsDetailVC = [[CRGoodsDetailViewController alloc] initWithGoodsId:goodsId goodsName:goodsName]; return goodsDetailVC;}@end

CRGoodsDetailViewController完成代码如下

#import "CRGoodsDetailViewController.h"@interface CRGoodsDetailViewController ()@property (nonatomic, copy) NSString *goodsId;@property (nonatomic, copy) NSString *goodsName;@property (nonatomic, strong) UILabel *statusLabel;@property (nonatomic, strong) UIButton *buyButton;@end@implementation CRGoodsDetailViewController- (instancetype)initWithGoodsId:(NSString *)goodsId goodsName:(NSString *)goodsName{ self = [super init]; if  { _goodsId = goodsId; _goodsName = goodsName; } return self;}- viewDidLoad { [super viewDidLoad]; self.navigationItem.title = self.title; [self.view addSubview:self.statusLabel]; [self.view addSubview:self.buyButton];}- viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; self.statusLabel.frame = CGRectMake(0, 0, 100, 20); self.statusLabel.center = self.view.center; self.buyButton.frame = CGRectMake(0, self.view.frame.size.height - 45, self.view.frame.size.width, 45);}#pragma mark - event - didClickBuyButton:(UIButton *)button{ }#pragma mark - getters- (UILabel *)statusLabel{ if (_statusLabel == nil) { _statusLabel = [[UILabel alloc] init]; _statusLabel.textColor = [UIColor redColor]; _statusLabel.font = [UIFont systemFontOfSize:15.f]; _statusLabel.textAlignment = NSTextAlignmentCenter; _statusLabel.text = @"暂未购买"; } return _statusLabel;}- (UIButton *)buyButton{ if (_buyButton == nil) { _buyButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_buyButton setTitle:@"立即购买" forState:UIControlStateNormal]; [_buyButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [_buyButton setBackgroundColor:[UIColor redColor]]; [_buyButton addTarget:self action:@selector(didClickBuyButton:) forControlEvents:UIControlEventTouchUpInside]; } return _buyButton;}@end

CRGoodsDetail做成私有pod
记得编辑podspec文件的时候加多dependencyCRProtocolManager
CRGoodsDetailServiceProtocol

为了少建八个项目首页模块小编是一直放在主项目中的,按理首页也应有是四个独自的pod.首页工作场景是,展现商品列表,点击有个别商品步入该商品详细的情况页.
所以他依靠CRGoodsDetailServiceProtocolCRProtocolManager因为首页模块正是主项目由此他还得依附CRGoodsDetail

谈起底首页大旨代码如下

#pragma mark - event- didClickGoodsButton:(UIButton *)button{ id<CRGoodsDetailServiceProtocol> goodsServiceProvide = [CRProtocolManager serviceProvideForProtocol:@protocol(CRGoodsDetailServiceProtocol)]; UIViewController *goodsDetailVC = [goodsServiceProvide goodsDetailViewControllerWithGoodsId:@"123" goodsName:@"农夫山泉矿泉水"]; [self.navigationController pushViewController:goodsDetailVC animated:YES]; }

参照商品详情新建确认订单业务入口pod
以及确认订单业务pod.和商品详情有分其他是,提交订单成功后要重临商品详情何况通告商品详情顾客已经购销,所以CRConfirmOrderServiceProtocol接口定义如下

@protocol CRConfirmOrderServiceProtocol <NSObject>- (UIViewController *)confirmOrderViewControllerWithGoodsId:(NSString *)goodsId sureComplete:(dispatch_block_t)sureComplete;@end

终极记得在商品详情增加跳转而且podspec里面加多dependency

Target-Action方案CTMediator地址直接用Casa开源的CTMediator

初稿未完毕 待续

实施

如何把模块做成私有pods小编这里就不介绍了,想清楚的能够看笔者先是篇组件化介绍作品。作者这里只拿确认订单模块比如

确认订单模块是个单身的project,为了防止任何模块调用确认订单模块需引入整个模块,这里又做了三个确认订单业务Category的民用组件如下图

图片 1icon

TAConfirmOrderBusinessCategory即是确认订单模块对外提供劳务的输入,大家的作业场景是商品详情模块立时购买步向确认订单模块,确认订单模块提交订单后归来商品详情模块,同一时间获得通告下单成功,所以上图中入参提供了ConfirmComplete的Block,下图是TAConfirmOrderBusinessCategory.m中的完成

#import "CTMediator+TAConfirmOrder.h"@implementation CTMediator (TAConfirmOrder)- (UIViewController *)confirmOrderViewControllerWithGoodsId:(NSString *)goodsId goodsName:(NSString *)goodsName ConfirmComplete:(dispatch_block_t)confirmComplete{ NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; params[@"goodsId"] = goodsId; params[@"goodsName"] = goodsName; params[@"completeBlock"] = confirmComplete; return [self performTarget:@"TAConfirmOrder" action:@"ConfirmOrderViewController" params:params shouldCacheTarget:NO];}@end

OK,TAConfirmOrderBusinessCategory落到实处完了,大家来看下TAConfirmOrder模块,模块中定义三个Target_TAConfirmOrder具体贯彻如下图

@interface Target_TAConfirmOrder : NSObject- (UIViewController *)Action_ConfirmOrderViewController:(NSDictionary *)params;@end

@implementation Target_TAConfirmOrder- (UIViewController *)Action_ConfirmOrderViewController:(NSDictionary *)params{ TAConfirmOrderViewController *confirmOrderVC = [[TAConfirmOrderViewController alloc] init]; confirmOrderVC.goodsId = params[@"goodsId"]; confirmOrderVC.goodsName = params[@"goodsName"]; confirmOrderVC.confirmComplete = params[@"completeBlock"]; return confirmOrderVC;}@end

既然TAConfirmOrderBusinessCategoryTAConfirmOrder是2个project,那category是怎么着调用到Target_TAConfirmOrder的吧?其实很简短,小编想看那篇小说的人民代表大会部分都领悟,无非正是NSClassFromString
,performSelector那一个主意,不亮堂的能够翻阅源码

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图