Oscar 1.0.0

Oscar 1.0.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2016年2月

Gorban Anastasiya维护。



 
依赖关系
RXPromise~> 0.13
CocoaLumberjack>= 0
 

Oscar 1.0.0

要求

iOS 7.0

安装

Oscar 可通过 CocoaPods 获得。要安装它,只需将以下行添加到您的 Podfile 中

pod "Oscar"

用法

计算机科学中的actor模型是一种并发计算的数学模型,将“actors”作为并发计算的通用原语:在接收到消息后,actor 可以做出局部决策,创建更多的 actors,发送更多的消息,并确定如何响应收到的下一个消息。(维基百科)

在actor模型中,我们有完整的actor对象集,其中每个actor都实现自己的行为。为了执行其行为,actor需要接收一定类型的消息。Actor定义了他可以接受的短信集和针对它们的反应。消息异步发送,但actor一次处理一个消息,而其他消息则在队列中等待。

这里是示例项目,包含一个简单的actor模型系统。

Actors 和 messages

要创建一个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];
    }];
}

对消息有三种类型的反应

  • void - 只做工作,不返回任何内容;
  • result - 立即返回结果;
  • future - 返回一个future对象 - 对异步任务很有用,或者如果消息被重定向到另一个actor。

Actor 系统

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提供者类型

  • Singleton - 在第一次访问时创建提供的类的actor;
  • Instance - 已初始化的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文件。