Потоковая передача между двумя NSURLConnections, блокировка чтения NSInputStream блокирует все соединения? - PullRequest
1 голос
/ 28 сентября 2011

Я пытаюсь передавать данные между двумя iOS NSURLConenctions (одна загрузка, другая загрузка), но не могу заставить ее работать.

  • У меня одновременно работают два соединения NSURLC.
  • Один загружает контент с URL с помощью запроса GET.
  • Другой загружает только что полученный контент на другой URL в теле запроса PUT.
  • В соединении для загрузки я использую setHTTPBodyStream, чтобы указать пользовательский NSInputStream, метод чтения которого возвращает данные, ранее полученные от другого соединения.
  • Обе NSURLConnections запланированы в циклах выполнения отдельных фоновых потоков, так что любые (возможно, блокирующие) обратные вызовы делегата не связываются друг с другом (и ни с основным потоком).

Поэтому я подумал, что это будет работать так:

  • Соединение загрузки вызывает [read: maxLength] (которое я переопределил) во входном потоке.
  • Поскольку данные еще не доступны, блокировка вызова чтения.
  • В другом потоке [connection: didReceiveData:] вызывается делегатом соединения для загрузки.
  • Он помещает полученные данные в общий буфер, делая его доступным для входного потока соединения загрузки.
  • Теперь вызов чтения потока загрузки больше не блокируется, он может вернуть часть данных.

К сожалению, на практике это не работает.После того, как метод чтения потока загрузки блокируется, методы делегата соединения загрузки (например, didReceiveData) больше не вызывают.(Обратите внимание, что если я отключу блокировку на стороне загрузки, тогда didReceiveData на стороне загрузки действительно будет вызываться нормально.)

Я подозреваю, что это должно что-то делать с тем фактом, что метод чтения входного потока загрузки загруженвызывается не в потоке, в котором были созданы соединение и объекты потока, а в каком-то другом потоке (очевидно созданном Какао).Как будто это был какой-то общий поток, используемый обоими NSURLConnections, поэтому, как только он заблокирован, все остальные соединения также перестают работать.Или что-то типа того.

Кто-нибудь имеет представление о том, что на самом деле происходит?

Кроме того, есть ли способ управления тем, в каком потоке вызывается метод read входного потока тела запроса?

...