Планирование потока на 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];

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

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

1 ответ

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

Другие вопросы по тегам