Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSMutableData,处理接收到的数据,然后从开始删除/重用缓冲区?_Ios_Nsmutabledata - Fatal编程技术网

Ios NSMutableData,处理接收到的数据,然后从开始删除/重用缓冲区?

Ios NSMutableData,处理接收到的数据,然后从开始删除/重用缓冲区?,ios,nsmutabledata,Ios,Nsmutabledata,这可能很容易。我使用GCDAsyncSocket从服务器接收表示离散数据块的可变字节数,这些数据块出现在NSMutableData对象中 如果数据是文字,则可能如下所示: ChunkChunkChunkChu nkChunkChunkChunkCh receive data, appending to myBuffer process contents of buffer up to last complete chunk create new myBuffer with partial f

这可能很容易。我使用GCDAsyncSocket从服务器接收表示离散数据块的可变字节数,这些数据块出现在NSMutableData对象中

如果数据是文字,则可能如下所示:

ChunkChunkChunkChu

nkChunkChunkChunkCh
receive data, appending to myBuffer
process contents of buffer up to last complete chunk
create new myBuffer with partial fragment of remaining data chunk at end of buffer
back to the start
因此,在处理了三个数据块之后,一个部分数据块“Chu”仍然存在,并且必须被保留,以便下一批数据可以与该数据块竞争

现在,处理流程如下所示:

ChunkChunkChunkChu

nkChunkChunkChunkCh
receive data, appending to myBuffer
process contents of buffer up to last complete chunk
create new myBuffer with partial fragment of remaining data chunk at end of buffer
back to the start
这很有效,但我不确定这是否是最有效的方法。我看到NSMutableData有一个replaceBytesInRange,我可以使用它从缓冲区的开始删除已处理字节的计数,但它是


有没有关于最好的方法的建议?如果有什么不同,我会使用ARC,因此我希望创建/释放的开销会减少。

我认为Mecki在你链接的帖子中弄错了。删除的数据越多,速度越快,因为需要复制的字节越少。此外,由于您只是简单地将数据从末尾移动到开头并更改长度,因此它应该比创建新缓冲区快,因为您只需复制字节,而无需创建缓冲区、复制字节和销毁旧缓冲区

使用您的示例,第一组数据是
chunkchu
。这是18字节长,您希望保留最后3个字节。使用
replaceBytesInRange:withBytes:length:
,操作如下所示:

ChunkChunkChunkChu

nkChunkChunkChunkCh
receive data, appending to myBuffer
process contents of buffer up to last complete chunk
create new myBuffer with partial fragment of remaining data chunk at end of buffer
back to the start
  • 使用完整的区块。在此之后,
    length
    为18,
    numLeft
    为3
  • 调用
    [buffer replaceBytesInRange:(NSRange){0,length numLeft}withBytes:nil length:0]
    A.将3个字节从位置15复制到位置0。
    B将长度设置为3
  • 接收更多数据
  • 通过创建一个新的缓冲区,操作如下所示

  • 使用完整的区块。在此之后,
    length
    为18,
    numLeft
    为3
  • 分配一个新的缓冲区
  • 将剩余字节追加到新缓冲区。
    A.将3个字节从旧缓冲区的位置15复制到新缓冲区的位置0。
    B新缓冲区的长度现在是3
  • 释放旧的缓冲区
  • 接收更多数据

  • 如您所见,该操作完全相同,只是第二个操作会产生创建新缓冲区和销毁旧缓冲区的开销。

    如果离散数据块被分隔,是否有原因不能使用
    -[GCDAsyncSocket readDataToData:withTimeout:tag]
    ?块的种类很多,也多种多样,因此没有任何方便的分隔符。处理数据的状态机确定块的结束位置,因此确实需要获取尽可能多的可用数据。