我看到一个问题CFReadStreamRead
,其中作为流式文件上传的一部分,永远不会返回。
这似乎只发生在 iOS7 上——并且在针对物理设备进行调试时比在模拟器中更频繁——或者至少,它在那里更为明显。
我们有一个文件的 HTTP(或 HTTPS,问题发生在任何一种方式,使用本地托管或远程服务器)POST
,通过直线阻塞(非事件驱动)CFNetwork 调用。这是 C 代码调用这个处理程序的必要条件;没有回调的规定。
这很好,网络调用发生在后台线程和/或通过异步调度。
有问题的网络代码归结为(为简洁起见删除错误处理):
CFReadStreamRef upload = CFReadStreamCreateWithFile(
kCFAllocatorDefault, upload_file_url);
CFRelease(upload_file_url);
CFReadStreamOpen(upload);
CFReadStreamRef myReadStream = CFReadStreamCreateForStreamedHTTPRequest(
kCFAllocatorDefault, myRequest, upload);
CFReadStreamOpen(myReadStream);
CFIndex numBytesRead = CFReadStreamRead(myReadStream, buf, sizeof(buf));
// etc.
就其本身而言,这段代码想在 iOS7 下立即挂起。usleep
如果我在它之前添加一个带有一些调用的循环(CFReadStreamHasBytesAvailable
一路检查),它几乎总是会成功。每隔几百次尝试,它仍然会失败,永远不会返回。同样,主线程不受影响。
我希望 GM 能清除这种行为,但它仍然存在。
添加一个 runloop/callback 方法来监视可用字节事件没有任何效果 - 当调用挂起时,也看不到任何事件。
关于为什么会发生这种情况或如何防止这种情况的任何建议?还有其他人CFReadStream
在 iOS 7 下看到不同的行为吗?