我最近用c ++编写了一个用于iOS / OSX的异步HTTP客户端。我很困惑为什么标头没有到达我的CFHTTPMessageRef响应对象,直到我意识到有一个对象潜伏为包含标头的流的属性(在处理kCFStreamEventBytesAvailable事件之后)。
所以现在我在调用我的事件处理程序之前,在流结束通知期间将标题从属性复制到我的响应对象中。
(可根据要求提供代码,有相当多的代码)
Apple文档在这个主题上的特点是沉默,我想知道是否有人知道苹果这个设计决定的原因。我很想知道如果我在某处有一个根本的误解?
编辑:文档说明了这一点:
在运行循环上安排请求后,您最终会得到 标题完整回调。此时,你可以打电话 CFReadStreamCopyProperty从读取中获取消息响应 流
但是,似乎没有迹象表明此事件掩码的名称或值是什么。
编辑:
完成了一些实验后,我发现流在发送kCFStreamEventOpenCompleted
通知后和第一次kCFStreamEventHasBytesAvailable
通知之前的某个时间创建了自己的响应对象。
在kCFStreamEventHasBytesAvailable
事件处理程序中,我可以这样做:
auto response = (CFHTTPMessageRef)CFReadStreamCopyProperty(readStream,
kCFStreamPropertyHTTPResponseHeader);
constexpr CFIndex bufferSize = 1024;
UInt8 buffer[bufferSize];
auto bytesRead = CFReadStreamRead(readStream, buffer, bufferSize);
if (bytesRead > 0) {
CFHTTPMessageAppendBytes(response, buffer, bytesRead);
}
CFRelease(response);
并且确实使用新的正文数据更新了流的响应消息对象。 现在我很好奇为什么这不仅仅是由流自动完成的?