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

Ada*_*ach 2 nsmutabledata ios

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

如果数据是单词,它可能如下所示:

ChunkChunkChunkChu

nkChunkChunkChunkCh
Run Code Online (Sandbox Code Playgroud)

因此,在处理了三个块之后,剩余部分块"Chu"并且必须保留,以便下一批数据可以竞争该块.

现在处理流程如下所示:

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
Run Code Online (Sandbox Code Playgroud)

这很有效,但我不确定它是否是最有效的方式.我看到NSMutableData有一个replaceBytesInRange,我可以用来从缓冲区的开始删除已处理的字节数,但据报道它是一个缓慢的操作.

有关最佳方法的任何建议吗?如果它有所作为我使用ARC,所以我希望减少创建/释放的开销.

ugh*_*fhw 5

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

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

  1. 使用完整的块.在此之后,length是18岁,numLeft是3 岁.
  2. 打电话[buffer replaceBytesInRange:(NSRange){0,length-numLeft} withBytes:nil length:0];
    给.将3个字节从位置15复制到位置0
    .将长度设置为3.
  3. 接收更多数据.

通过创建新缓冲区,操作如下所示.

  1. 使用完整的块.在此之后,length是18岁,numLeft是3 岁.
  2. 分配新缓冲区.
  3. 将剩余的字节附加到新缓冲区.
    一个.将旧缓冲区的位置15的3个字节复制到新缓冲区的位置0.
    湾 新缓冲区的长度现在为3.
  4. 释放旧缓冲区.
  5. 接收更多数据.

如您所见,操作完全相同,只是第二个操作有创建新缓冲区和销毁旧缓冲区的开销.