如何通过NSData交换各种类型的数据?

时间:2015-11-30 13:32:11

标签: swift nsdata

我正在创建一个蓝牙匹配游戏应用程序。我在func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID)上使用MCSessionDelegate

我希望逐个交换各种类型的数据,如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)
    }
}

1 个答案:

答案 0 :(得分:1)

可能的解决方案:
创建:
•使用模型类型创建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,但是如果你想要越来越多的可能值,你可能想要获得更大的偏移量,但这应该已经足够了。