Iphone 这是通过GameKit构建和发送NSData的有效方法吗?
这是我第一次尝试使用NSData和Gamekit。所以我想知道我是否正确打包了数据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
- (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
对象,而是直接在其中创建
您不必依赖于最大数据包大小。您使用了一个常量,这很好,因为如果需要一段时间的较大数据包,您可以在一个地方更改该常量。但这并不是真正需要的
您的版本不是线程安全的,因为它依赖于静态缓冲区。这可能很好,因为不是每个方法都必须是线程安全的。但这是必须注意的
使用快速枚举还有助于降低开销,并且更具可读性