阻止dispatch_queue直到它发送整个数据

时间:2014-09-30 17:23:25

标签: objective-c grand-central-dispatch tcp-ip gcdasyncsocket

我试图通过创建tcp / ip连接发送一些在目标c中在服务器端创建波形的十六进制数据包。我的问题是我能够发送数据并且还可以在服务器上看到波形然而,由于网络延迟,有时波形变得重叠(原因是服务器在5分钟后尝试同步数据包)。我的问题基本上是如何以这样的方式将数据包发送到服务器,直到数据包被同步,我不再向服务器发送另一个包

    dispatch_queue_t connectionTest=dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
                    dispatch_async(connectionTest, ^{
                    if(outputStream)
                    {

                        NSInteger sizeOfPacket=13;
                        unsigned char myPacket[13];
                        unsigned char crcCal=0;
                        myPacket[0]=START_OF_HEADER;
                        myPacket[1]=START_OF_TEXT;
                        myPacket[2]=8;
                        myPacket[3]=0x6a;
                        myPacket[4]=0x06;
                        myPacket[5]=0x80;
                        myPacket[6]=Some value;// 
                        myPacket[7]=0x80;
                        myPacket[8]=Some value;//
                        myPacket[9]=0x54;//changed 54 to 50
                        myPacket[10]=0x04;
                        for (int j=3;j<myPacket[2]+3;j++)
                        {
                            crcCal=crcTable[crcCal^myPacket[j]];
                        }
                        myPacket[11]=crcCal;
                        myPacket[12]=END_OF_TEXT;

                        NSLog(@"crc value is %c",crcCal);


                        NSData* dataPacket = [NSData dataWithBytes:(const void *)myPacket length:sizeof(unsigned char)*sizeOfPacket];
                        [outputStream write:[dataPacket bytes] maxLength:[dataPacket length]];

                    }
                    });

1 个答案:

答案 0 :(得分:0)

一种方法可能是dispatch_suspend发送数据包的块内的传出队列,然后dispatch_resume从任何代码接收来自服务器的确认的传出队列。