如何在 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 框架中传输对象数据的主要内容,如果未能解决你的问题,请参考以下文章