Pau*_*oub 9 cfnetwork cfreadstream ios ios7
我发现一个问题,其中CFReadStreamRead,作为流式文件上传的一部分,从来没有返回.
这似乎只发生在iOS7上 - 而且在对物理设备进行调试时比在模拟器中更常见 - 或者至少在那里更明显.
我们POST通过直线阻塞(非事件驱动)CFNetwork调用来获取文件的HTTP(或HTTPS,问题以本地托管或远程服务器的方式发生).调用此处理程序的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.
Run Code Online (Sandbox Code Playgroud)
就其本身而言,此代码希望立即在iOS7下挂起.如果我usleep在它之前添加一个带有一些调用的循环(CFReadStreamHasBytesAvailable沿途检查),它几乎总是会成功.每隔几百次尝试,它仍将失败,永不返回.同样,主线程不受影响.
我希望通用汽车能够清除这种行为,但它仍然存在.
添加runloop/callback方法以监视字节可用事件无效 - 当调用挂起时,也不会看到任何事件.
有关为什么会发生这种情况或如何防止这种情况的任何建议?其他人CFReadStream在iOS 7下看到不同的行为?
我已经尝试过这种令人讨厌的解决方法,它对我有用,问题是我正在从服务器请求增量值,所以如果出现问题,我只是获取新的增量值,一般情况下它不会工作(在日志中)我看到有时会出现超时)。至少这可以防止形成永久线程阻塞,并提供以某种方式处理此问题的机会:
NSInteger readStreamReadWorkaround(CFReadStreamRef readStrem, UInt8 *buffer, CFIndex bufferLength) {
static dispatch_once_t onceToken;
static BOOL isProblematicOs = YES;
dispatch_once(&onceToken, ^{
isProblematicOs = [[UIDevice currentDevice].systemName compare: @"7.0" options: NSNumericSearch]!=NSOrderedAscending;
});
NSInteger readBytesCount = -2;
if (isProblematicOs) {
CFStreamStatus sStatus = CFReadStreamGetStatus(readStrem);
NSDate *date = [NSDate date];
while (YES) {
if(CFReadStreamHasBytesAvailable(readStrem)) {
readBytesCount = CFReadStreamRead(readStrem, buffer, bufferLength);
break;
}
sStatus = CFReadStreamGetStatus(readStrem);
if (sStatus!=kCFStreamStatusOpen && sStatus !=kCFStreamStatusAtEnd
|| [date timeIntervalSinceNow]<-15.0) {
break;
}
usleep(50000);
}
} else {
readBytesCount = CFReadStreamRead(readStrem, buffer, sizeof(buffer));
}
return readBytesCount;
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个解决方案,但到目前为止我没有看到替代方案。
| 归档时间: |
|
| 查看次数: |
1125 次 |
| 最近记录: |