В Mac OS X Lion CARemoteLayerServer и CARemoteLayerClient были добавлены в QuartzCore. Я пытался выяснить, подходят ли они для разделения графического приложения между несколькими процессами, но безуспешно.
Я могу успешно использовать их в одном процессе, с некоторым кодом в следующем виде:
- (void)buildLayerSingleProcess
{
CARemoteLayerServer *server = [CARemoteLayerServer sharedServer];
self.client = [[CARemoteLayerClient alloc] initWithServerPort: server.serverPort];
uint32_t clientID = self.client.clientId;
CALayer *layer1 = [CALayer layer];
layer1.bounds = CGRectMake(0.0, 0.0, 100.0, 100.0);
CGColorRef color = CGColorCreateGenericRGB(0.4, 0.2, 0.3, 1.0);
[layer1 setBackgroundColor: color];
CFRelease(color);
[layer1 setOpacity: 0.75];
[layer1 setBorderWidth: 5.0f];
layer1.position = CGPointMake([[self.window contentView] frame].size.width / 2.0, [[self.window contentView] frame ].size.height / 2.0);
self.client.layer = layer2;
CALayer *servedLayer = [CALayer layerWithRemoteClientId: self.client.clientId];
[[[self.window contentView] layer] addSublayer: servedLayer];
}
Это хорошо, но я бы хотел попробовать сделать что-то похожее между процессами. Тот факт, что server.serverPort имеет тип mach_port_t, подразумевает, что он подходит для использования между процессами.
Однако, когда я разделяю этот код для запуска в двух процессах (либо в двух отдельных приложениях, либо в основном процессе и службе XPC), когда я пытаюсь инициализировать CARemoteLayerClient с mach_port_t с сервера в другом процессе, я получить:
unable to register with server: 0x10000003
Вполне возможно, что они не подходят для между случайными процессами, но использование mach_port_t своего рода подразумевает это.
Кто-нибудь еще имел успех, используя эти классы между процессами?