如何通过 NSData 交换各种类型的数据?
How can I exchange various type's data through NSData?
我正在创建一个蓝牙比赛游戏应用程序。我在 MCSessionDelegate
.
上使用 func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID)
我想根据具体情况交换各种类型的数据,例如 GameStatusClass、PlayerClass、EnemyClass、CGPoint 等。
然后这是我的代码。
我认为,我的代码不好,因为 unarchiveObjectWithData
被调用了两次。
您有什么想法可以编写简单或漂亮的示例代码吗?
enum ModelType {
case A
case B
}
class BasicModel: NSObject {
var modelType : ModelType?
}
class ModelA: BasicModel {
var x = 100
override init() {
super.init()
self.modelType = ModelType.A
}
}
class ModelB: BasicModel {
var y = "test"
override init() {
super.init()
self.modelType = ModelType.B
}
}
class NearbyManager : NSObject, MCSessionDelegate {
func session(session: MCSession, didReceiveData data: NSData,
fromPeer peerID: MCPeerID) {
dispatch_async(dispatch_get_main_queue()) {
let tmp = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! BasicModel
switch tmp.modelType! {
case ModelType.A:
let a = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! ModelA
self.funcA(a)
case ModelType.B:
let b = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! ModelB
self.funcB(b)
}
}
}
func funcA(data: ModelA) {
print(data.x)
}
func funcB(data: ModelB) {
print(data.y)
}
}
可能的解决方案:
创建:
• 使用模型类型创建 NSData
。
• 将您的对象存档到 NSData
.
• 附加两个数据。
正在阅读:
• 读取第一个八位字节以获得类型。
• 取消归档其余部分(带偏移量)。
在Objective-C,但是应该很容易翻译成Swift(代码没测试,但是你应该明白逻辑)
//发送:
NSData *typeData = [NSData dataWithBytes:&ModelTypeA length: sizeof(uint_16)];
NSData *objectData = [NSKeyedArchiver archivedDataWithRootObject:objectA];
NSMutableData *dataToSend = [[NSMutableData alloc] init];
[dataToSend appendData:typeData];
[dataToSend appendData:objectData];
//阅读:
if ([data length] > 1)
{
NSData *typeData = [data subdataWithRange:NSMakeRange(0,1)];
uint_16 type;
[typeData getBytes:type];
NSData *objectData = [data subdataWithRange:NSMakeRange(1, [data length]-1];
switch (type)
{
case ModelTypeA:
{
ModelA *a = (ModelA *)[NSKeyedUnarchiver unarchiveObjectWithData:objectData];
[self func:a];
}
break;
case ModelTypeB:
{
ModelB *b = (ModelB *)[NSKeyedUnarchiver unarchiveObjectWithData:objectData];
[self func:b];
}
break;
default:
break;
}
}
注意:我将偏移量设置为 1,但如果您想要越来越多的可能值,您可能希望获得更大的偏移量,但这应该已经足够了。
我正在创建一个蓝牙比赛游戏应用程序。我在 MCSessionDelegate
.
func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID)
我想根据具体情况交换各种类型的数据,例如 GameStatusClass、PlayerClass、EnemyClass、CGPoint 等。
然后这是我的代码。
我认为,我的代码不好,因为 unarchiveObjectWithData
被调用了两次。
您有什么想法可以编写简单或漂亮的示例代码吗?
enum ModelType {
case A
case B
}
class BasicModel: NSObject {
var modelType : ModelType?
}
class ModelA: BasicModel {
var x = 100
override init() {
super.init()
self.modelType = ModelType.A
}
}
class ModelB: BasicModel {
var y = "test"
override init() {
super.init()
self.modelType = ModelType.B
}
}
class NearbyManager : NSObject, MCSessionDelegate {
func session(session: MCSession, didReceiveData data: NSData,
fromPeer peerID: MCPeerID) {
dispatch_async(dispatch_get_main_queue()) {
let tmp = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! BasicModel
switch tmp.modelType! {
case ModelType.A:
let a = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! ModelA
self.funcA(a)
case ModelType.B:
let b = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! ModelB
self.funcB(b)
}
}
}
func funcA(data: ModelA) {
print(data.x)
}
func funcB(data: ModelB) {
print(data.y)
}
}
可能的解决方案:
创建:
• 使用模型类型创建 NSData
。
• 将您的对象存档到 NSData
.
• 附加两个数据。
正在阅读:
• 读取第一个八位字节以获得类型。
• 取消归档其余部分(带偏移量)。
在Objective-C,但是应该很容易翻译成Swift(代码没测试,但是你应该明白逻辑)
//发送:
NSData *typeData = [NSData dataWithBytes:&ModelTypeA length: sizeof(uint_16)];
NSData *objectData = [NSKeyedArchiver archivedDataWithRootObject:objectA];
NSMutableData *dataToSend = [[NSMutableData alloc] init];
[dataToSend appendData:typeData];
[dataToSend appendData:objectData];
//阅读:
if ([data length] > 1)
{
NSData *typeData = [data subdataWithRange:NSMakeRange(0,1)];
uint_16 type;
[typeData getBytes:type];
NSData *objectData = [data subdataWithRange:NSMakeRange(1, [data length]-1];
switch (type)
{
case ModelTypeA:
{
ModelA *a = (ModelA *)[NSKeyedUnarchiver unarchiveObjectWithData:objectData];
[self func:a];
}
break;
case ModelTypeB:
{
ModelB *b = (ModelB *)[NSKeyedUnarchiver unarchiveObjectWithData:objectData];
[self func:b];
}
break;
default:
break;
}
}
注意:我将偏移量设置为 1,但如果您想要越来越多的可能值,您可能希望获得更大的偏移量,但这应该已经足够了。