在具有多种连接的设备之间传递任何数据类型

时间:2013-10-25 13:03:33

标签: objective-c ios7 nsdata nsobject multipeer-connectivity

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

我已成功完成此操作。我希望用户能够做的是从相机胶卷中选择像照片一样的东西并将其传递给另一个连接的设备。我正在做其他事情,不仅仅是UIImage,(例如NSString,NSObject ......)

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

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

OR

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

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

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

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

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

2 个答案:

答案 0 :(得分: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格式发送。

希望有所帮助。

答案 1 :(得分:3)

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

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

    id myObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

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

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

   //Handle
}

这适用于任何类,只要它符合NSCoding协议即可。看看:Encoding and Decoding Objects