测试已测试 | ✓ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2016年2月 |
依赖关系 | |
RXPromise | ~> 0.13 |
CocoaLumberjack | >= 0 |
iOS 7.0
Oscar 可通过 CocoaPods 获得。要安装它,只需将以下行添加到您的 Podfile 中
pod "Oscar"
计算机科学中的actor模型是一种并发计算的数学模型,将“actors”作为并发计算的通用原语:在接收到消息后,actor 可以做出局部决策,创建更多的 actors,发送更多的消息,并确定如何响应收到的下一个消息。(维基百科)
在actor模型中,我们有完整的actor对象集,其中每个actor都实现自己的行为。为了执行其行为,actor需要接收一定类型的消息。Actor定义了他可以接受的短信集和针对它们的反应。消息异步发送,但actor一次处理一个消息,而其他消息则在队列中等待。
这里是示例项目,包含一个简单的actor模型系统。
要创建一个actor,你需要从 OSActor 类继承
@interface THSessionActor : OSActor
@end
然后重写 -setup:
,定义actor可以接受哪种类型的消息,并对它们提供反应
- (void)setup {
[self on:[THLogin class] doFuture:^RXPromise *(THLogin *message) {
return [self askSession:message.email password:message.password];
}];
[self on:[THLogout class] _do:^(id o) {
[self.sessionStorage clear];
}];
}
对消息有三种类型的反应
Actor 通常对其他 actors 有引用,并通过消息传递机制与他们通信。actors 在actor系统中初始化,对它们的引用只能通过系统获取。
如何创建actor系统
OSMainActorSystem *system = [[OSMainActorSystem alloc] initWithConfigs:configs serviceLocator:serviceLocator builderBlock:^(OSActorSystemBuilder * builder) {
[builder addActorsPull:[THAPIActor class] count:3];
[builder addSingleton:[THSessionActor class]];
[builder addActor:^OSActor *(id<OSActorSystem> system) {
return [THAuthActor actorWithActorSystem:system];
}];
}];
可以添加到系统中的actor提供者类型
要向角色发送消息,需要角色引用。
OSActorRef *sessionActor = [sut actorOfClass:[SomeActor class] caller:self];
任何类的消息都可以发送给角色(但最好消息是不可变的)。
RXPromise *session = [sessionActor ask:[[THLogin alloc] initWithLogin:login password:password]];
消息发送的结果是Future对象,它将用某些结果填充或因错误而拒绝。
session.then(^id(id result){
NSLog(@"Session: %@", result);
return nil;
},
^id(NSError* error){
NSLog(@"Error: %@", error);
return nil;
});
角色系统使用服务定位器初始化。服务定位器是一个包含您非角色的自定义服务引用的对象。您可以通过类或协议注册您的服务。
OSServiceLocator *serviceLocator = [[OSServiceLocator alloc] initWithBuilderBlock:^(OSServiceLocator *locator) {
THSessionStorage *sessionStorage = [THSessionStorage new];
[serviceLocator registerService:sessionStorage];
[serviceLocator registerService:sessionStorage forProtocol:@protocol(THSessionProvider)];
}];
以后您可以在您的角色中访问它们。
[self on:[THLogout class] _do:^(id o) {
THSessionStorage *sessionStorage = [self.serviceLocator serviceForClass:[THSessionStorage class]];
[sessionStorage clear];
}];
Oscar可在MIT许可下使用。有关更多信息,请参阅LICENSE文件。