当前位置: 代码网 > it编程>App开发>苹果IOS > iOS 组件化初步构思

iOS 组件化初步构思

2024年05月15日 苹果IOS 我要评论
一、ios 组件化常用方式讨论使用openurl进行组件的注册和调用app 启动时实例化各组件模块,然后这些组件向 modulemanager 注册 url ,有些时候不需要实例化,使用 class

一、ios 组件化常用方式讨论

使用openurl进行组件的注册和调用

app 启动时实例化各组件模块,然后这些组件向 modulemanager 注册 url ,有些时候不需要实例化,使用 class 注册。
当组件a需要调用组件b时,向 modulemanager 传递 url ,参数跟随 url 以 get 方式传递,类似openurl 。然后由 modulemanager 负责调度组件b,最后完成任务。

方案分析

第一步的问题,在组件化的过程中,注册 url 并不是充分必要条件,组件是不需要向组件管理器注册url的。而且注册了 url 之后,会造成不必要的内存常驻,如果只是注册class,内存常驻量就小一点,如果是注册实例,内存常驻量就大了。

第二步。在 ios 领域里,一定是组件化的中间件为 openurl 提供服务,而不是 openurl 方式为组件化提供服务。

问题在于无法表达非常规对象。
如果是传递复杂对象,如 uiimage ,只能做如下表达

[a openurl:@"http://baidu.com/detail" 
    params:@{
        @"id":"abc123",
        @"type":"1",
        @"image":[uiimage imagenamed:@"iosimage"]}
]

如果不像上面这么做,复杂参数和非常规参数就无法传递。如果这么做了,那么事实上这就是拆分远程调用和本地调用的入口了。

url 注册对于实施组件化方案是不必要的,且通过 url 注册的方式形成的组件化方案,拓展性和可维护性都会被打折。

注册 url 的目的其实是一个服务发现的过程,在 ios 领域中,服务发现的方式是不需要通过主动注册的,使用 runtime 就可以了。另外,注册部分的代码的维护是一个相对麻烦的事情,每一次支持新调用时,都要去维护一次注册列表。如果有调用被弃用了,是经常会忘记删项目的。runtime 由于不存在注册过程,那就也不会产生维护的操作,维护成本就降低了。

二、对组件化的构思

以上方式主要是基于 mediator 模式和 target-action 模式,中间采用了 runtime 来完成调用。这套组件化方案将远程应用调用和本地应用调用做了拆分,而且是由本地应用调用为远程应用调用提供服务,与常用方案正好相反。

调用方式

先说本地应用调用,本地组件a在某处调用

[[mediator sharedinstance] performtarget:targetname action:actionname params:@{…}]

向 mediator 发起跨组件调用,mediator 根据获得的 target 和 action 信息,通过 objective-c 的 runtime 转化生成 target 实例以及对应的 action 选择子,然后最终调用到目标业务提供的逻辑,完成需求。

在远程应用调用中,远程应用通过 openurl 的方式,由ios系统根据 info.plist 里的 scheme 配置找到可以响应 url 的应用,应用通过 appdelegate 接收到url之后,调用 mediator 的 openurl: 方法将接收到的url信息传入。当然, mediator 也可以用 openurl:options: 的方式顺便把随之而来的option 也接收,这取决于你本地业务执行逻辑时的充要条件是否包含 option 数据。传入 url 之后,mediator 通过解析 url ,将请求路由到对应的 target 和 action ,随后的过程就变成了上面说过的本地应用调用的过程了,最终完成响应。

以上就是ios 组件化初步构思的详细内容,更多关于ios组件化常用方式的资料请关注代码网其它相关文章。也希望大家可以多多关注代码网,后续我们将带来更精彩的更新!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com