ActorKernel 0.1.0

ActorKernel 0.1.0

MrDekk 维护。



  • MrDekk

DataKernel

Language: Swift Language: Swift Build Status not yet Carthage compatible not yet CocoaPods compatible

什么是 ActorKernel?

ActorKernel 是 Swift 编程语言中另一个 actor 实现。它深受 Akka 的启发,但完全基于 Swift 特性从头编写。

如有任何建议,请提交 issue。如需使用示例 - 请参阅单元测试,它非常简单易懂。

特性

  • Swift(在 XCode 9.1 上测试过)
  • 基于协议的设计
  • 全面测试
  • 积极支持

设置

CocoaPods

注意:ActorKernel 目前与 CocoaPods 不兼容。计划如此,但尚未准备就绪

  1. 安装 CocoaPods。您可以使用 gem install cocoapods 来完成安装。
  2. 编辑您的 Podfile 文件并添加以下行 pod 'ActorKernel'(您必须使用 use_frameworks!,因为这是一个 Swift pod)
  3. 使用命令 pod install 更新您的 pods
  4. 打开生成的 workspace 文件(.xcworkspace 文件)中的项目。

注意:您还可以通过在 Podfile 行中直接指定来测试最后的提交

Carthage

注意: ActorKernel 目前与 Carthage 不兼容。截至此时(2017年12月31日),尚未计划,但如果您真的需要它 - 请为其创建一个问题。

  1. 使用 brew install carthage 在您的计算机上安装 Carthage
  2. 编辑您的 Cartfile 文件,添加以下行 github "mrdekk/ActorKernel"
  3. 使用 carthage update 更新并构建框架
  4. 按照此处的步骤将生成的框架添加到您的应用主目标中

如何使用

创建一个 ActorContainer

let container = ActorContainer()

您可以创建所需的任意多个容器。您甚至可以在不同的容器之间发送消息给 actors,这不受禁止,但也不是完全测试过的。

定义一个消息结构体

struct SuperMessage {
  let field1: String
  let field2: Bool
  ...
}

强烈建议消息将使用不可变值类型的结构体。

定义一个 Actor

class MyActor : BasicActor {
  override func process(_ message: Any, sender: Actable?) {
    switch message {
      case let m as SuperMessage:
        // process m as SuperMessage struct

      default:
        super.process(message, sender: sender)
    }
  }
}

Actor 建议使用类。Actor 应该覆盖处理消息的功能 - 这是每个 actor 的主要入口点。

如果您想您的 Actor 在主线程上执行操作,请使用 UIActor 协议标记它们,如下所示

class MyActor : BasicActor, UIActor {
  ...
}

创建一个Actor

let actor = container.actor(for: MyActor.self)

如果您两次调用actor(for:),您将获得相同的实例,因此基本Actor在同一个容器中类似于单例。但它不是真正的单例,因为如果您定义了两个容器,您可以在每个容器中具有同一个'singleton' Actor的实例。

如果您需要所谓的'原型' Actor(可以在一个容器内具有多个实例的Actor),您应该将您的Actor类标记为PrototypeActor协议

class MyActor : BasicActor, PrototypeActor {
  ...
}

向Actor发送消息

向Actor发送消息有三种方法,对于所有这些方法,您都应该有一个Actor的引用。

  1. 直接告诉Actor一条消息
actor.tell(SuperMessage(), sender: nil)
  1. 在延迟后向Actor发送消息
actor.tell(SuperMessage(), delay: 10, sender: nil)

延迟是TimeInterval类,因此需要正确构造它

  1. 使用运算符!的语法糖

受到Akka的启发

actor ! SuperMessage()

建议

  1. 将您的Actor设计为状态机(有限自动机)。
  2. 使用发送者变量向发送者Actor发送响应消息。

贡献

支持

如果您想沟通任何问题、建议甚至做出贡献,请牢记以下流程

  • 如果您需要帮助,请使用带有'tag actorkernel'的Stack Overflow提问。
  • 如果您想就一般问题提问,也请使用Stack Overflow。
  • 当您需要报告错误或提出功能请求时,请打开一个问题。
  • 如果您想做出贡献,请提交一个pull request,并记住遵守与代码风格、测试等相关规则。

行为准则

本项目遵守[开源行为准则][code-of-conduct]。您的参与意味着您将遵守此准则。[code-of-conduct]: http://todogroup.org/opencodeofconduct/#ActorKernel/[email protected]

许可协议

MIT 许可证 (MIT)

版权所有 <2017>

在此特此授予任何获得此软件及其相关文档文件(以下统称为“软件”)副本的人免费权利,不受限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、转让和/或销售软件副本,并允许向提供软件的人员授予上述权利,但受以下条款约束:

上述版权声明和本许可声明应包含在软件的所有复制或实质性部分中。

本软件“按原样”提供,不提供任何形式(明示或暗示)的保证,包括但不限于对适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责任,这些索赔、损害或其他责任来源于合同、侵权或任何其他行为,与软件或软件的使用或其他相关活动有关。