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