我是Objective C的新手,正在开发基于MultipeerConnectivity
网络项目框架的iOS移动应用。这个框架为我提供了设备之间的发送消息和接收消息方法。
这里我想通过此函数发送一个由我自己定义的MyMessage
NSObject来传输不同类型的数据。但是,我想要包含一个NSMutableArray
,它在一个消息对象中包含多个信息对象。
@interface MyMessage : NSObject
{
NSMutableArray playersInfo;
}
@end
据我所知,在Objective C中我们不能像这样静态地分配接口类型。相反,我们应该使用指针。但是,在这种情况下,如果我将playersInfo
设置为指针NSMutableArray* playersInfo
,则在将对象传输到另一个设备后,另一个设备无法获取playersInfo
指向的数据。 (我假设MyMessage
对象将仅使用浅层copt传输,因此NSMutableArray* playersInfo
中的数据将不会被传输。这里我问我如何实现一个可以包含实际NSObject数据的消息类。 / p>
答案 0 :(得分:1)
与任何实现一样,要发送数据,您需要将原语,结构或对象分解为可通过通信链接传输的数据块。有时这称为序列化(通常在应用于对象时)
在iOS中,可以使用NSKeyedArchive / Unarchive序列化对象。因此,在您的示例中,您存储在数组中的每个对象都需要通过符合NSCoding实现Archive / Unarchive逻辑
然后,要生成序列化数据(NSData对象),您将调用数组对象上的归档器。 NSArray符合NSCoding协议。
您想要去的深度/浅度取决于您的实施。在实现encodeWithCoder时,您可以决定要编码/解码的对象属性的数量。
我使用此模式与数据交换,但我也使用继承扩展它 - 例如我定义了一个类:myMessageBase然后将该Base类继承到我的各种Message变体中。
答案 1 :(得分:0)
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];