何が起こっているのかわからないことに気付いたときのその沈む感じ...
私はこのコードをネットワークコードでほぼ2年間問題なく使用しています。
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呼び出しは、上記のコードで実際に何をしますか?サンプルコードがその呼び出しを行うのはなぜですか?このコードがメインスレッドで実行されている場合、実行ループを実行する必要はありませんか?