Планирование потока на 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, где мой делегат получает события в каком-то рабочем потоке. Вы можете увидеть процесс планирования здесь