Iphone 这是通过GameKit构建和发送NSData的有效方法吗?

Iphone 这是通过GameKit构建和发送NSData的有效方法吗?,iphone,objective-c,Iphone,Objective C,这是我第一次尝试使用NSData和Gamekit。所以我想知道我是否正确打包了数据 - (void)sendNetworkPacket:(GKSession *)session packetID:(int)packetID reliable:(BOOL)howtosend { // the packet we'll send is resued static unsigned char networkPacket[kMaxTankPacketSize]; const unsigned in

这是我第一次尝试使用NSData和Gamekit。所以我想知道我是否正确打包了数据

- (void)sendNetworkPacket:(GKSession *)session packetID:(int)packetID  
reliable:(BOOL)howtosend 
{
// the packet we'll send is resued
static unsigned char networkPacket[kMaxTankPacketSize];
const unsigned int packetHeaderSize = 2 * sizeof(int); // we have two "ints" for our 
header

int *pIntData = (int *)&networkPacket[0];
// header info
pIntData[0] = gamePacketNumber++;
pIntData[1] = packetID;
int theLength = 2 * sizeof(int);

for (int i=0; i<([theHands.player1Hand count]); i++)
{
    pIntData[2+i] = [[theHands.player1Hand objectAtIndex:i] intValue];
    theLenght += sizeof(int);
}   

NSData *packet = [NSData dataWithBytes: networkPacket length: theLength];

[session sendData:packet toPeers:[NSArray arrayWithObject:gamePeerId]  
withDataMode:GKSendDataReliable error:nil];
}
-(void)sendNetworkPacket:(GKSession*)会话packetID:(int)packetID
可靠:(BOOL)如何发送
{
//我们将发送的数据包已恢复
静态无符号字符网络包[kMaxTankPacketSize];
const unsigned int packetHeaderSize=2*sizeof(int);//我们的
标题
int*pIntData=(int*)和网络数据包[0];
//标题信息
pIntData[0]=游戏包编号++;
pIntData[1]=packetID;
int长度=2*sizeof(int);

对于(int i=0;i您正确地创建了
NSData
,它将包含您期望的内容。但是这比必要的要复杂得多。以下操作也可以:

enum { kHeaderLength = 2 };
NSMutableData *packet = [NSMutableData dataWithLength: (kHeaderLength + [theHands.player1Hand count]) * sizeof( int )];
int *pIntData = (int *)[packet mutableBytes];

*pIntData++ = gamePacketNumber++;
*pIntData++ = packetID;

for (id thing in theHands.player1Hand) { 
  *pIntData++ = [thing intValue];
}

[session sendData: packet toPeers: [NSArray arrayWithObject: gamePeerId] withDataMode: GKSendDataReliable error: NULL];
这将有一些好处:

  • 数据包数据不会复制到
    NSData
    对象,而是直接在其中创建
  • 您不必依赖于最大数据包大小。您使用了一个常量,这很好,因为如果需要一段时间的较大数据包,您可以在一个地方更改该常量。但这并不是真正需要的
  • 您的版本不是线程安全的,因为它依赖于静态缓冲区。这可能很好,因为不是每个方法都必须是线程安全的。但这是必须注意的
  • 使用快速枚举还有助于降低开销,并且更具可读性

  • 您正确地创建了
    NSData
    ,它将包含您期望的内容。但这比必要的要复杂得多。以下操作也可以:

    enum { kHeaderLength = 2 };
    NSMutableData *packet = [NSMutableData dataWithLength: (kHeaderLength + [theHands.player1Hand count]) * sizeof( int )];
    int *pIntData = (int *)[packet mutableBytes];
    
    *pIntData++ = gamePacketNumber++;
    *pIntData++ = packetID;
    
    for (id thing in theHands.player1Hand) { 
      *pIntData++ = [thing intValue];
    }
    
    [session sendData: packet toPeers: [NSArray arrayWithObject: gamePeerId] withDataMode: GKSendDataReliable error: NULL];
    
    这将有一些好处:

  • 数据包数据不会复制到
    NSData
    对象,而是直接在其中创建
  • 您不必依赖于最大数据包大小。您使用了一个常量,这很好,因为如果需要一段时间的较大数据包,您可以在一个地方更改该常量。但这并不是真正需要的
  • 您的版本不是线程安全的,因为它依赖于静态缓冲区。这可能很好,因为不是每个方法都必须是线程安全的。但这是必须注意的
  • 使用快速枚举还有助于降低开销,并且更具可读性