CFReadStreamRead
ストリーミング ファイル アップロードの一部として、が返されないという問題が発生しています。
これは iOS7 でのみ発生するようであり、シミュレーターよりも物理デバイスに対してデバッグする場合にはるかに頻繁に発生するか、少なくとも 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 で別の動作を見ている人はいますか?