Планирование потока в NSRunLoop

Я следовал этому руководству http://www.raywenderlich.com/3932/networking-tutorial-for-ios-how-to-create-a-socket-based-iphone-app-and-server. и у меня все работает нормально, но есть одна строка в тексте, которую я не понимаю:

Наши потоки должны быть постоянно готовы к отправке или получению данных. Чтобы включить это, мы должны запланировать поток для получения событий в цикле выполнения. Если мы не назначим цикл выполнения, делегат заблокирует выполнение нашего кода до тех пор, пока в потоке не будет данных для чтения или записи, чего мы хотим избежать.

Но если я прокомментирую строки в коде:

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

все по-прежнему будет работать нормально. Я действительно не понимаю, почему я должен планировать это в основном цикле выполнения?

Как я вижу, все, что происходит в основном потоке, обрабатывается в этом цикле выполнения. Поэтому, если я нажму кнопку, она будет обработана в основном цикле выполнения. Здесь, если я не планирую это в основном цикле выполнения, байты все еще получаются и отправляются, поэтому для меня это означает, что они обрабатываются в основном цикле выполнения.


person MegaManX    schedule 15.12.2014    source источник


Ответы (1)


Вы можете запланировать свой поток в любом цикле выполнения, который вы хотите. Методы обратного вызова делегата будут вызываться в таком потоке, где он был запланирован. Например, я написал несколько модульных тестов для своей библиотеки POSInputStreamLibrary, где мой делегат получает события в каком-то рабочем потоке. Вы можете увидеть процесс планирования здесь

person Pavel Osipov    schedule 16.12.2014