QHOServiceManager组件通信

QHOServiceManager 的基本模式是什么?

原本两个库中的 A / B 两个库中的类是直接交互的,A 的 caller 是直接调用 B 的 service 方法的:

QHOServiceManager组件通信

QHOServiceManager 创建了一个中间层,让 A 不直接和 B 交互,而是通过一个 Protocol 在运行时获取到 B 的 service 的实例,所有的 Protocol 存放在一个叫做 SerivceRegistry 的库:

QHOServiceManager组件通信

如何使用 QHOServiceManager 调用 Service?

#import <QHOServiceManager.h>
#import <SomeObjectProtocol.h>
...
[QHO_SERVICE_FOR(SomeObjectProtocol) someMethod];
// 如果 SomeObjectProtocol 不存在对应的 Service,QHO_SERVICE_FOR 会抛出异常
// 如果不希望抛出异常,可以将 QHO_SERVICE_FOR 替换为 QHO_OPTIONAL_SERVICE_FOR

如何使用 QHOServiceManager 创建 Protocol?

目前 QHOServiceManager 存在 ServiceRegistry 仓库,ServiceRegistry 仓库的一般使用流程为:

1. calller 方和 service 方约定好 protocol,service 方在 ServiceRegistry 中提交 PR,通过检查后 caller 方也认可 protocol 形式,caller 方 approve,service 方 merge 并自动发版

2. caller 方和 service 方同时自己组件依赖的 ServiceRegistry 的版本,然后:

service 方在自己的组件中进行 service 的实现

caller 方在自己的组件中通过 protocol 进行调用,为了能够调试通过,可以在自己的 Demo 工程中建立 protocol 的 mock 实现

3. service 方将实现组件集成

4. caller 方将调用组件集成

如何使用 QHOServiceManager 注册 Service?

首先需要 Service 声明实现对应的 Protocol,然后需要在对应 Service 的 @implementation ... @end 中,使用 QHO_REGISTER_IMP_FOR 宏进行注册,例如:

// .h 文件
#import "QHOSimpleExampleProtocol.h"

@interface QHOSimpleExampleService : NSObject <QHOSimpleExampleProtocol>
  
@end
// .m 文件
#import "QHOSimpleExampleService.h"
#import <QHOServiceManager/QHOServiceManager.h>

@implementation QHOSimpleExampleService

QHO_REGISTER_IMP_FOR(QHOSimpleExampleProtocol)
  
@end

如果需要 Service 以单例的形式存在,可以使用 QHO_MARK_NEED_SINGLETON 来声明:

...
@implementation QHOSimpleExampleService

QHO_REGISTER_IMP_FOR(QHOSimpleExampleProtocol)
  
QHO_MARK_NEED_SINGLETON()
  
@end

如何使用 QHOServiceManager 进行本地仓库 Mock 测试

如果你的 Demo 中没有对应的 Service 类,但是希望 Demo 可以顺利运行,可以在自己的 Demo 仓库中实现一个简单的 Mock Service。

在 Demo 工程里,创建一个 Mock 类,使用 QHO_REGISTER_IMP_FOR 宏来标记 Mock Service 即可。

// .h 文件
#import "QHOSimpleExampleProtocol.h"

@interface MockService : NSObject <QHOSimpleExampleProtocol>
  
@end
// .m 文件
#import "MockService.h"
#import <QHOServiceManager/QHOServiceManager.h>

@implementation MockService

QHO_REGISTER_IMP_FOR(QHOSimpleExampleProtocol)
  
@end

当我希望一个协议可以有多个实现者时,我应该怎么办?

目前的设计中,一个协议只可以有一个实现类存在。但是,我们也可以通过协议的继承,来完成同样的功能。

比如在首页弹框治理的过程中,首页声明了一个基本类型的协议,然后分别给城市弹窗、红包雨、用户通知引导弹窗声明了各自的协议,这些协议都继承了这个基本类型的弹窗。

在 Service.json 中,基本类型的协议没有声明实现类,继承他的协议都声明了实现类。

首页通过这些协议,控制各个弹窗是否可以弹出。

 

上一篇:微信公众号页面如何跳转至关注公众号页面


下一篇:火狐浏览器(firefox)中js要注意的问题