eDistantObject 1.0.2

eDistantObject 1.0.2

Aditya Atul TirodkarAlbert Wang 维护。



  • Google LLC.

eDistantObject

Apache License Build Status

eDistantObject (easyDistantObject 或 eDO) 为用户提供了一种简单的远程调用方法,用于在 Objective-C 和 Swift 之间进行进程间的远程调用,而无需显式构造 RPC 结构。

NSDistantObject 类似,eDistantObject 充分利用 Objective-C 运行时功能:在一个进程中,它表现为代理或木偶;在接收到消息时,它通过通信层(POSIX 套接字)将消息转发到不同进程中的对象。

您可以在 设置指南 中找到设置 eDO 的指南,并通过代码尝试它,更多关于 eDO 如何实际工作的内容,请参考 详细文档

如何使用

考虑一个典型用例,其中客户端需要与宿主进行通信。eDO 的使用步骤分为三个主要步骤

1. 宿主

在宿主端,必须创建一个 EDOHostService,以便设置 eDistantObject。假设这是在 Host.m 文件中完成的。添加以下代码将设置一个简单的远程对象。

执行队列将持有 EDOHostService 的强引用,因此需要保留它以保持服务的活跃状态。要停止提供根对象,我们可以调用 invalidate API 或释放队列,这会隐式地使提供根对象的服务失效。

FooClass 仅作为占位符。任何类都可以这样使用。

- (void)startUp {
  // Arbitrary port number for starting the service. Ensure that this doesn't
  // conflict with any existing ports being used.
  UInt16 portNumber = 12345;

  // The root object exposed is associated with a dispatch queue, any invocation made
  // on this object will have its invocations forwarded to the host. The invocations
  // will be dispatched to the associated queue.
  FooClass *rootObject = [[FooClass alloc] init];
  // If the execution queue is released, the EDOHostService running in this
  // queue will be released as well. Users can choose their own way to
  // retain the queue.
  self.executionQueue = dispatch_queue_create("MyQueue", DISPATCH_QUEUE_SERIAL);
  [EDOHostService serviceWithPort:portNumber
                       rootObject:rootObject
                            queue:self.executionQueue];
}

2. 共享头

为了使客户端和主机都能了解FooClass类中可用的方法,需要在主机和客户端目标中都公开头文件FooClass.h。然而,任何来自客户端的调用都将转发到主机,因此只需要编译和与主机进程链接FooClass.m

# FooClass.h

@interface FooClass
- (void)method1;
@end

# FooClass.m omitted [Present only in the Host Process, containing the implementation of method1]

3. 客户端

在客户端,如果一个名为Client.m的文件调用远程对象FooClass,需要使用EDOClientService获取根远程对象。一旦设置好,就可以使用远程对象,就像它是本地对象一样,调用会被代理到主机。

- (void)someMethod {
  // The object, fetched remotely from the host is seen by the client to be the same as a local
  // object.
  FooClass *rootObject = [EDOClientService rootObjectWithPort:portNumber];
  [rootObject method1];
}

有关更多信息,请参考代码编写位置

Swift 支持

虽然 eDO 使用 Objective-C 的功能,但如果定义和使用时标记为按照 Objective-C 方式调用,它也可以在 Swift 中使用。

对于 Swift 支持,需要一些额外的设置。请参考Swift 指南

为贡献者

在做出任何贡献之前,请确保您已经遵循了CONTRIBUTING.md中的指南。

设置 eDistantObject 项目

  1. 从 GitHub 克隆 eDistantObject 仓库
git clone https://github.com/google/eDistantObject.git
  1. 克隆完 eDistantObject 仓库后,安装依赖项
pod install
  1. 打开 eDistantObject.xcworkspace 并确保所有目标都编译成功。
  2. 现在您可以使用 eDistantObject.xcworkspace 来对项目进行修改。