scheduleInRunLoop -потоковая передача сетевых подключений

Я не нашел достойной документации, объясняющей процесс многопоточности для NSStream. Чтобы быть конкретным, давайте перейдем к NSInputStream. Потоки в Objective -C для меня в настоящее время остаются загадкой просто потому, что они кажутся такими простыми.

Мой вопрос относится в первую очередь к этой строке:

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

Вы можете указать цикл выполнения, в котором будет выполняться входной поток, что мне показалось довольно крутым. Дело в том, что если я хочу, чтобы входной и выходной потоки выполнялись в своих собственных потоках, и оба были созданы в одном классе, скажем Connection, то как заставить их работать в своих собственных потоках?

Причина, по которой я спрашиваю, связана с делегатами. Раньше мы бы сделали [inputStream setDelegate:self], что означает, что мы должны объявить stream:handleEventдля обработки входящих/исходящих данных.

Итак, в конечном счете, мой вопрос: если у вас есть один класс, который устанавливает поток ввода и вывода, как вы оба связываете каждый поток и делегируете ответственность за обработку событий потока текущему классу?

Вот код, который можно пожевать:

[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];

Я думаю о следующем:

  • Вы не можете делегировать ответственность за оба потока в текущем классе, вам придется делегировать отдельные объекты.
  • Один поток подойдет для обоих потоков? (Лично я так не думаю, потому что ввод/вывод будет выполняться одновременно)
  • Я думаю, что это неправильно, и вы можете создать отдельный цикл выполнения и вызвать scheduleRunLoop для какого-то отдельного потока?

Любые идеи?

6
задан jscs 28 July 2012 в 08:27
поделиться