如何在 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 移动应用程序。该框架为我提供了设备之间的发送消息和接收消息方法。
这里我想通过这个函数发送一个自己定义如下的MyMessage
NSObject,用来传输不同种类的数据。但是,我想包含一个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 邀请的拒绝?