文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

iOS 组件化的三种方案

2023-09-17 18:17

关注

组件化

本文主要介绍iOS组件化的三种方案


1、常⽤的三种方案

1.1、 URL Scheme路由

URL Scheme路由示例 

//MTMediator.h --- starttypedef void(^MTMediatorProcessBlock)(NSDictionary *params);+ (void)registerScheme:(NSString *)scheme processBlock:(MTMediatorProcessBlock)processBlock;+ (void)openUrl:(NSString *)url params:(NSDictionary *)params;//MTMediator.h --- end//MTMediator.m --- start+ (NSMutableDictionary *)mediatorCache{    static NSMutableDictionary *cacheScheme;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        cacheScheme = @{}.mutableCopy;    });    return cacheScheme;}+ (void)registerScheme:(NSString *)scheme processBlock:(MTMediatorProcessBlock)processBlock{    if (scheme.length > 0 && processBlock) {        [[[self class] mediatorCache] setObject:processBlock forKey:scheme];    }}+ (void)openUrl:(NSString *)url params:(NSDictionary *)params{    MTMediatorProcessBlock block = [[[self class] mediatorCache] objectForKey:url];    if (block) {        block(params);    }}//MTMediator.m --- end//注册 --- start+ (void)load {    [MTMediator registerScheme:@"detail://" processBlock:^(NSDictionary * _Nonnull params) {        NSString *url = (NSString *)[params objectForKey:@"url"];        UINavigationController *navigationController = (UINavigationController *)[params objectForKey:@"controller"];        MTDetailViewController *controller = [[MTDetailViewController alloc] initWithUrlString:url];//        controller.title = [NSString stringWithFormat:@"%@", @(indexPath.row)];        [navigationController pushViewController:controller animated:YES];    }];}//注册 --- end//调用 --- start//URL Scheme[MTMediator openUrl:@"detail://" params:@{@"url":item.articleUrl,@"controller":self.navigationController}];//调用 --- end复制代码

目前iOS上大部分路由工具都是基于URL 进行匹配的,或者命名约定,通过runtime方法进行动态调用

优点:实现简单

缺点:需要维护字符串表,依赖于命名约定,无法在编译时暴露出所有问题,需要在运行时才能发现错误。

MGJRouter

URL路由方式主要是以蘑菇街为代表的的MGJRouter

实现原理:

// 1、注册某个URLMGJRouter.registerURLPattern("app://home") { (info) in    print("info: (info)")}//2、调用路由MGJRouter.openURL("app://home")复制代码

URL 路由的优点

URl 路由的缺点

1.2、Target - Action

Target - Action示例 

//MTMediator.h#import #import NS_ASSUME_NONNULL_BEGIN@interface MTMediator : NSObject//target action+ ( __kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl;@endNS_ASSUME_NONNULL_END//MTMediator.m#import "MTMediator.h"@implementation MTMediator+ ( __kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl{    Class detailVC = NSClassFromString(@"MTDetailViewController");    UIViewController *controller = [[detailVC alloc] performSelector:NSSelectorFromString(@"initWithUrlString:") withObject:detailUrl];    return controller;}@end//调用 //Target - Action UIViewController *vc = [MTMediator detailViewControllerWithUrl:item.articleUrl]; vc.title = @"详情啊"; [self.navigationController pushViewController:vc animated:YES];复制代码

CTMediator

原理是通过oc的runtime、category特性动态获取模块,例如通过NSClassFromString获取类并创建实例,通过performSelector + NSInvocation动态调用方法。

实现原理:

CTMediator使用

//******* 1、分类定义新接口extension CTMediator{    @objc func A_showHome()->UIViewController?{        //在swift中使用时,需要传入对应项目的target名称,否则会找不到视图控制器        let params = [            kCTMediatorParamsKeySwiftTargetModuleName: "CJLBase_Example"        ]        //CTMediator提供的performTarget:action:params:shouldCacheTarget:方法 通过传入name,找到对应的targer和action        if let vc = self.performTarget("A", action: "Extension_HomeViewController", params: params, shouldCacheTarget: false) as? UIViewController{            return vc        }        return nil    }}//******* 2、模块提供者提供target-action的调用方式(对外需要加上public关键字)class Target_A: NSObject {    @objc func Action_Extension_HomeViewController(_ params: [String: Any])->UIViewController{        let home = HomeViewController()        return home    }}//******* 3、使用if let vc = CTMediator.sharedInstance().A_showHome() {            self.navigationController?.pushViewController(vc, animated: true)        }复制代码

模块间的关系:

模块A——Mediator——target——模块B

优点

缺点

1.2、Protocol - Class

Protocol - Class示例

//具体的Protocol//MTMediator.h --- start@protocol MTDetailViewControllerProtocol + (__kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl;@end@interface MTMediator : NSObject+ (void)registerProtol:(Protocol *)protocol class:(Class)cls;+ (Class)classForProtocol:(Protocol *)protocol;@end//MTMediator.h --- end//MTMediator.m --- start+ (void)registerProtol:(Protocol *)protocol class:(Class)cls{    if (protocol && cls) {        [[[self class] mediatorCache] setObject:cls forKey:NSStringFromProtocol(protocol)];    }}+ (Class)classForProtocol:(Protocol *)protocol{    return [[[self class] mediatorCache] objectForKey:NSStringFromProtocol(protocol)];}//MTMediator.m --- end//被调用//MTDetailViewController.h --- start@protocol MTDetailViewControllerProtocol;@interface MTDetailViewController : UIViewController@end//MTDetailViewController.h --- end//MTDetailViewController.m --- start+ (void)load {    [MTMediator registerProtol: @protocol(MTDetailViewControllerProtocol) class:[self class]];}#pragma mark - MTDetailViewControllerProtocol+ ( __kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl{    return [[MTDetailViewController alloc]initWithUrlString:detailUrl];}//MTDetailViewController.m --- end//调用Class cls = [MTMediator classForProtocol: @protocol(MTDetailViewControllerProtocol)];if ([cls respondsToSelector: @selector(detailViewControllerWithUrl:)]) {        [self.navigationController pushViewController:[cls detailViewControllerWithUrl:item.articleUrl] animated:YES];}复制代码

BeeHive

protocol比较典型的三方框架就是阿里的BeeHiveBeeHive借鉴了Spring Service、Apache DSO的架构理念,采用AOP+扩展App生命周期API形式,将业务功能基础功能模块以模块方式以解决大型应用中的复杂问题,并让模块之间以Service形式调用,将复杂问题切分,以AOP方式模块化服务。

BeeHive 核心思想

示例如下:

//******** 1、注册[[BeeHive shareInstance] registerService:@protocol(HomeServiceProtocol) service:[BHViewController class]];//******** 2、使用#import "BHService.h"id< HomeServiceProtocol > homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];复制代码

优点

缺点

建议:URL Scheme - handler 配合 Protocol - Class 使用
 

附带:iOS组件化方案架构设计图


​​​​​​​

 

来源地址:https://blog.csdn.net/yezuiqingxin/article/details/126018623

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯