QHOServiceManager 的基本模式是什么?
原本两个库中的 A / B 两个库中的类是直接交互的,A 的 caller 是直接调用 B 的 service 方法的:
QHOServiceManager 创建了一个中间层,让 A 不直接和 B 交互,而是通过一个 Protocol 在运行时获取到 B 的 service 的实例,所有的 Protocol 存放在一个叫做 SerivceRegistry 的库:
如何使用 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 中,基本类型的协议没有声明实现类,继承他的协议都声明了实现类。
首页通过这些协议,控制各个弹窗是否可以弹出。