美文网首页
iOS组件化及通信方式(一)

iOS组件化及通信方式(一)

作者: yangfei02821 | 来源:发表于2021-02-03 18:58 被阅读0次

    iOS组件化
    组件化方案及通信方式

    组件化介绍

    cocoapods机制
    基础-podSpec使用
    一、上传cocoapods过程

    1、开发框架,上传第三方代码管理平台
    2、创建框架描述spec,包含:框架名称、版本、真正代码存放地址=远程地址
    3、上传spec到cocopods的远程索引库

    二、cocoapods机制

    1、在git上有cocoapods的远程索引库https://github.com/CocoaPods/Specs
    2、通过pod setup 将远程索引库下载到本地,
    3、本地索引库还有一个检索索引文件,
    4、当添加第三方库的时候先去检索索引文件查找,再去本地索引库查找,然后再去真正的代码存放地址去下载第三方库。

    三、组件化实践
    组件化私有库
    组件化实践
    组件化实践详解

    过程与cocoapods相似
    1、创建自己的私有远程索引库
    2、拉取私有远程索引库到本地
    3、将自己的私有框架代码上传私有库中
    4、将私有框架代码中的spec文件上传私有远程索引库
    5、使用时,在Podfile添加source,下载过程同cocoapods

    四、将组件化源码变成静态库

    1、添加静态库的targets


    1添加静态库的targets

    2、拖动calss下的文件到targets下,选择方式为引用


    2拖动文件夹
    3、更改描述文件
    # vendored_frameworks 仅仅是针对于, 我们创建编译之后的库, 是framework
    # .a s.vendored_libraries = "xxxx"
    
    if ENV['IS_SOURCE'] || ENV['XMGDownLoad']
        s.source_files = 'XMGDownLoad/Classes/**/*'
    else
        s.source_files = 'XMGDownLoad/Classes/**/*.h'
        s.vendored_frameworks = 'XMGDownLoad/Products/XMGDownLoad.framework'
    end
    

    注:添加方式都可以,区别:Xcode工程,蓝色文件夹、黄色文件夹以及 .bundle文件的区别
    Greate groups:是在工程中,添加一个分组,和文件目录中的文件存放位置没有绝对的对应关系,在项目中可能在一个groups中的文件,在访达中可能是凌乱的或者分布在多个文件夹下。可以参加编译。
    Greate folder references:是添加了一个文件夹的引用,并且在这个目录不会添加到工程编译目录,换句话说就是这个目录下的文件不能被其他的group中的文件包含。

    五、库版本一致,代码不同,安装新的库,需要删除pod缓存,安装最新的库

    pod cache clean --all

    组件化通信方式

    1、url-block

    也就是常说的蘑菇街组件化方案,主要是在启动的时候(load方法中)注册组件间提供的服务,建立url和block对应关系(调用方使用url,找到对应组件方提供服务的block,获取组件对外提供的服务。
    这种方式在从已有项目中进行组件拆分效果比较好,最大的优势体现在解耦方面,使用此方案可以迅速对已有业务进行拆分。但是实际在使用过程中会比较大的弊端。比如:
    1、需要维护url-block的表(如果url书写错误那么组件会不起作用)
    2、参数传递方面的限制会比较大,通过url带参的方式,一些特殊类型没法传递(NSData、UIImage等等)
    3、需要一个Router的配合,组件越多Router会越复杂,耦合较多

    2、target-action

    目前使用最多且耦合性最小方案
    给组件封装一层target来对外提供服务,不会对原来组件造成入侵;通过实现中间件的Category来提供服务给宿主,宿主只需要依赖中间件,而组件则不需要依赖中间件。
    弊端:
    1、代码量会比较大,在对外提供服务的基础上需要增加一个category与之对应
    2、对于一些model的使用,基于通用性以及高内聚的原则,最好使用NSDictionary的方式去model化,所以这块的维护是一个比较大的工作量,随着业务的修改,改变不可避免

    3、直接使用宿主工程作为中间件

    我们的业务需求,底层库是统一的,需要单独抽离出来,但是业务层各个业务线各不相同,直接就算一个宿主工程,我们只需要把底层库披露统一的api和注册代理,就可以完成宿主工程和底层库的通信。

    相关文章

      网友评论

          本文标题:iOS组件化及通信方式(一)

          本文链接:https://www.haomeiwen.com/subject/duymtltx.html