如何在 Objective C Multipeer Connectivity 框架中传输对象数据

Posted

技术标签:

【中文标题】如何在 Objective C Multipeer Connectivity 框架中传输对象数据【英文标题】:How to transmit NSObject data in Objective C MultipeerConnectivity framwork 【发布时间】:2014-04-11 05:22:32 【问题描述】:

我是 Objective C 的新手,正在开发基于 MultipeerConnectivity 网络项目框架的 ios 移动应用程序。该框架为我提供了设备之间的发送消息和接收消息方法。

这里我想通过这个函数发送一个自己定义如下的MyMessageNSObject,用来传输不同种类的数据。但是,我想包含一个NSMutableArray,它在单个消息对象中包含多个信息对象。

@interface MyMessage : NSObject

    NSMutableArray playersInfo;

@end

我知道在 Objective C 中我们不能像这样静态分配接口类型。相反,我们应该使用指针。但是,在这种情况下,如果我将playersInfo设置为指针NSMutableArray* playersInfo,那么在对象传输到另一个设备后,另一个设备就无法获取playersInfo指向的数据。 (我假设 MyMessage 对象将仅使用浅层 copt 传输,因此 NSMutableArray* playersInfo 中的数据将不会被传输)这里我问如何实现一个可以包含实际 NSObject 数据的消息类。

【问题讨论】:

你看过***.com/questions/19851510/… 【参考方案1】:

与任何实现一样,要发送数据,您需要将原语、结构或对象分解为可通过通信链路传输的数据块。有时这称为序列化(通常应用于对象时)

在 iOS 中,可以使用 NSKeyedArchive/Unarchive 序列化对象。因此,在您的示例中,您存储在数组中的每个对象都需要通过符合 NSCoding 来实现存档/取消存档逻辑

然后,要生成序列化数据(NSData 对象),您将调用数组对象上的归档程序。 NSArray 符合 NSCoding 协议。

你想去多深/多浅取决于你的实现。作为实现 encodeWithCoder 的一部分,您可以决定要编码/解码多少对象属性。

我使用此模式与同行交换数据,但我也使用继承对其进行扩展 - 例如,我定义了一个类:myMessageBase 然后将该 Base 类继承到我的各种 Message 变体中。

【讨论】:

谢谢。是的,我知道我需要将 MyMessage 对象转换为 NSData 进行传输。但是,这里的情况是在我的 MyMessage 类中,我打算放置一个 NSMutable 数组。如果我只在 MyMessage 对象上调用 Archive,我会丢失对象中 NSMutable Array 指针指向的数据吗?如果是这样,我应该如何解决? 您的 encodeWithCoder 实现将在 NSMutableArray 上调用 encode。你读过 NSCoding 协议参考吗?如果你用谷歌搜索,它非常简单,而且有很多例子。比如雷·温德利希?【参考方案2】:
MultipeerConnectivity framework allows you to send NSData using MCSession API . convert your NSArray to NSData then send 

[self.session sendData:messageData toPeers:self.session.connectedPeers withMode:MCSessionSendDataReliable error:&error];

将 NSData 转换为 NSArray

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]

将 NSArray 转换为 NSData

NSString *错误; NSData *data = [NSPropertyListSerialization dataFromPropertyList:array format:NSPropertyListBinaryFormat_v1_0 errorDescription:&error];

【讨论】:

谢谢。是的,我知道我需要将 MyMessage 对象转换为 NSData 进行传输。但是,这里的情况是在我的 MyMessage 类中,我打算放置一个 NSMutable 数组。如果我只在 MyMessage 对象上调用 Archive,我会丢失对象中 NSMutable Array 指针指向的数据吗?如果是这样,我应该如何解决?

以上是关于如何在 Objective C Multipeer Connectivity 框架中传输对象数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Multipeer Connectivity 框架邀请用户加入我的会话?

如何从 Multipeer Connectivity Session 更改视图 UILabel、UIButtons、UIViews 等?

如何使用 Multipeer Connectivity (Swift 3) 在会话中通过 didReceiveData() 调用 table.reloadData

如何检测 Multipeer Connectivity 邀请的拒绝?

如何使用 Multipeer Connectivity 安全地停止发送图像

MultiPeer 框架避免使用 MCBrowserView?