1

2 つの iOS NSURLConenctions (1 つはダウンロード、もう 1 つはアップロード) の間でデータをストリーミングしようとしていますが、うまくいかないようです。

  • 2 つの NSURLConnections を同時に実行しています。
  • 1 つは、GET 要求を使用して URL からコンテンツをダウンロードすることです。
  • もう 1 つは、PUT 要求の要求本文で、受信したばかりの同じコンテンツを別の URL にアップロードすることです。
  • アップロード接続では、 setHTTPBodyStream を使用して、読み取りメソッドが他の接続から以前に受信したデータを返すカスタム NSInputStream を指定しています。
  • 両方の NSURLConnections は、別々のバックグラウンド スレッドの実行ループでスケジュールされているため、(ブロックしている可能性がある) デリゲート コールバックが互いに (メイン スレッドとも) 干渉しないようになっています。

だから私はそれが次のように機能すると思った:

  • アップロード接続は、入力ストリームで [read:maxLength] (オーバーライドしました) を呼び出します。
  • 利用可能なデータがまだないため、読み取り呼び出しはブロックされます。
  • 別のスレッドでは、ダウンロード接続のデリゲートで [connection:didReceiveData:] が呼び出されます。
  • 受信したデータを共有バッファーに入れ、アップロード接続の入力ストリームで使用できるようにします。
  • アップロード ストリームの読み取り呼び出しがブロックされなくなり、データのチャンクを返すことができるようになりました。

残念ながら、実際にはこれは機能しません。アップロード ストリームの読み取りメソッドがブロックされた後、ダウンロード接続のデリゲート メソッド (didReceiveData など) は呼び出されなくなります。(アップロード側でブロックを無効にすると、ダウンロード側の didReceiveData が正常に呼び出されることに注意してください。)

これは、アップロード入力ストリームの read メソッドが、接続とストリーム オブジェクトが作成されたスレッドではなく、別のスレッド (明らかに Cocoa によって作成された) で呼び出されるという事実と関係があると思われます。これが両方の NSURLConnections で使用される共有スレッドであるかのように、ブロックされると、他のすべての接続も同様に機能しなくなります。またはそのようなもの。

実際に何が起こっているのか、誰かが考えを持っていますか?

また、リクエストボディ入力ストリームの read メソッドが呼び出されるスレッドを制御する方法はありますか?

4

0 に答える 0