那下沉的感觉,当你意识到你不知道发生了什么事......我一直在使用这种代码在我的网络代码几乎两年没有问题混淆CFNetwork的,CFReadStreamOpen和CFRunLoopRun
。
if (!CFReadStreamOpen(myReadStream)) {
CFStreamError myErr = CFReadStreamGetError(myReadStream);
if (myErr.error != 0) {
// An error has occurred.
if (myErr.domain == kCFStreamErrorDomainPOSIX) {
// Interpret myErr.error as a UNIX errno.
strerror(myErr.error);
} else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {
OSStatus macError = (OSStatus)myErr.error;
}
// Check other domains.
}
}
我相信它最初基于这里给出的示例代码:
我最近注意到,然而,一些连接失败,因为CFReadStreamOpen返回false,但错误代码是0在以上的链接更多一些盯着后,我注意到CFRunLoopRun()语句,并将其添加:
if (!CFReadStreamOpen(myReadStream)) {
CFStreamError myErr = CFReadStreamGetError(myReadStream);
if (myErr.error != 0) {
// An error has occurred.
if (myErr.domain == kCFStreamErrorDomainPOSIX) {
// Interpret myErr.error as a UNIX errno.
strerror(myErr.error);
} else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {
OSStatus macError = (OSStatus)myErr.error;
}
// Check other domains.
} else
// start the run loop
CFRunLoopRun();
}
该固定吨他连接问题。然而,我的应用程序开始显示随机问题 - 界面有时不响应,或不绘制,文本字段不可编辑,这种东西。
我读过CFReadStreamOpen和运行循环(特别是,主运行循环运行自己,我不应该运行一个运行循环,除非我设置它自己在一个辅助线程 - 我据我所知,不是。)但是我仍然对上面实际发生的事情感到困惑。具体来说:
1)为什么CFReadStreamOpen有时返回FALSE和错误代码0?这实际上意味着什么?
2)在上面的代码中,CFRunLoopRun调用实际上做了什么?为什么示例代码会这样调用 - 如果此代码在主线程中运行,我不应该运行运行循环?