3

我正在尝试在我的应用程序中实现多点连接框架。

我已经成功地做到了这一点。我希望用户能够做的是从相机胶卷中选择图片之类的东西并将其传递给另一个连接的设备。我正在做其他事情,而不仅仅是 UIImage,(例如 NSString、NSObject...)

理想情况下,我想做的是能够使用它并使用以下两种方法之一接收它:

- (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID;

或者

- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {

然而,我想要的是一种标准化的方式(对于任何对象类型),使用多点连接将其传递给另一个设备。

我唯一的想法是将每个对象转换为 NSData 然后将其传递,但​​是,这在接收端不起作用。我的测试是:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:self.myImage];
NSLog(@"%@", myData);

然后我不知道如何将其转换回来。它与 NSCoding 有关吗?任何想法将不胜感激!:) 谢谢!!

4

2 回答 2

3

听起来你有正确的想法,你只需要在收到数据时使用 NSKeyedUnarchiver 。

- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {

    id myObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

从那里您可以确定您实际收到的对象类型:

if ([myObject isKindOfClass:[SomeClass class]]){

   //Handle
}

这适用于任何类,只要它符合 NSCoding 协议。看看:编码和解码对象

于 2013-10-25T14:36:05.897 回答
3

我建议的是实现一个协议来在设备之间传输 NSData 对象。有一个在设备之间发送的标准化数据包。如

type | length | data....

类型和长度应该是整数,所以当它们到达另一边时,您可以确切地知道它们有多大。然后长度会告诉你你的实际数据包有多长。

一个简单的例子

// method received "(id) data" which can be UIImage, NSString, NSDictionary, NSArray

// 1 -> Image
// 2 -> JSON
uint32_t type;

if ([data isKindOfClass:[UIImage class]]) {
   data = UIImageJPEGRepresentation((UIImage *)data, 1.0);
   type = 0;
} else {
   data = [data JSONData];
   type = 1;
}

uint32_t length = [data length];

NSMutableData *packet = [NSMutableData dataWithCapacity:length + (INT_32_LENGTH * 2)];
[packet appendBytes:&type length:INT_32_LENGTH];
[packet appendBytes:&length length:INT_32_LENGTH];
[packet appendData:data];

然后在另一端,您只需读取数据包的长度,检查类型并转换回正确的对象类型。对于图像以二进制数据包发送,对于其他任何东西以 JSON 发送。

希望有帮助。

于 2013-10-25T13:18:36.310 回答