【问题标题】:Pass any data type between devices with multipeer connectivity在具有多点连接的设备之间传递任何数据类型
【发布时间】:2013-10-25 13:03:33
【问题描述】:

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

我已经成功地做到了。我希望用户能够做的是从相机胶卷中选择图片之类的东西并将其传递给另一个连接的设备。不过,我正在使用其他东西,而不仅仅是 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 有关吗?任何想法将不胜感激! :) 谢谢!!

【问题讨论】:

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


    【解决方案1】:

    听起来你的想法是对的,你只需要在收到数据时使用 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

    【讨论】:

      【解决方案2】:

      我的建议是实现一个协议来在设备之间传输 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 形式发送。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-07-15
        • 1970-01-01
        • 2016-11-20
        • 2020-04-05
        • 1970-01-01
        • 2016-11-07
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        相关资源
        最近更新 更多