• Понимание NSRunLoop

    Кто-нибудь может объяснить для чего это NSRunLoop? так как я знаю NSRunLoop это что-то связанное с NSThread да? Предположим, я создаю нить подобное

    NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil]; [th start];  -(void) someMethod {     NSLog(@"operation"); } 

    так что после этого поток завершает свое право работать? зачем использовать RunLoops или где использовать ? из Яблока документы я читал что-то, но не понятно для меня, поэтому, пожалуйста, объяснить так просто, как это возможно

  • Ответы

  • Выполнения петли-это абстракция, которая (среди прочего) обеспечивает механизм для обработки входных источников системы (сокеты, порты, файлы, клавиатура, мышь, таймеры, и т. д.).

    Каждый NSThread имеет свой собственный цикл выполнения, которые могут быть доступны через метод currentRunLoop.

    В общем, вы не должны получить доступ к бегу петли напрямую, хотя есть некоторые (сетей) компоненты, которые могут позволить вам указать, какой цикл выполнения они будут использовать для обработки ввода/вывода.

    Запуск цикла для данного потока будут ждать, пока один или более источников сигнала имеются какие-либо данные или событие, то пожар соответствующий обработчик входа(ов) для обработки каждого входного источника, который уже "готов"..

    После этого, он потом вернется в свой цикл, обработка ввода от разных источников, и "сна", если нет работы.

    Это довольно высокий уровень описание (стараясь избегать слишком многих деталей).

    Редактировать

    Попытка ответить на комментарий. Я разбил его на мелкие кусочки.

    • это означает, что я могу только открыть/запустить, чтобы запустить цикл внутри правой резьбы?

    Действительно. NSRunLoop не является потокобезопасным, и должны быть использованы только в том контексте потока, в котором выполняется цикл.

    • есть ли простой пример, как добавить событие, чтобы запустить цикл ?

    Если вы хотите следить за портом, вы бы просто добавить, что порт на бегу петли, и затем запустить цикл будет посмотреть, что порт для деятельности.

    - (void)addPort:(NSPort *)aPort forMode:(NSString *)mode 

    Вы также можете добавить явно таймер с

    - (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode 
    • что означает, что он потом вернется к своей петле?

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

    • запускается цикл неактивным, когда я запустить поток?

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

    • можно ли добавить некоторые события, чтобы поток выполнения петли снаружи-нить?

    Я не уверена, что понимаю вас здесь. Вы не будете добавлять события для выполнения петли. Вы добавляете источники входного сигнала и источников Таймер (от потока, которому принадлежит цикл выполнения). Бегу петлю, а затем наблюдает за ними по активности. Вы можете, конечно, предоставить входные данные из других потоков и процессов, но ввод будет обрабатываться запустить цикл, который является мониторинг этих источников в потоке, в котором выполняется цикл выполнения.

    • это значит, что иногда я могу использовать петли, чтобы заблокировать поток на некоторое время

    Действительно. В самом деле, запустить цикл "проживания" в обработчике события до того возвращения из обработчика событий. Вы можете увидеть это в любом приложении достаточно просто. Установить обработчик для любого ИО действий (например, нажатие кнопки), что спит. Вы будет блокировать основной цикл выполнения (и весь интерфейс) пока что метод завершается.

    То же самое относится к любой цикл выполнения.

    Я предлагаю вам прочитать следующую документацию на выполнения петель:

    https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsrunloop_Class/Reference/Reference.html

    и как они используются в рамках темы:

    https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

    Runloops немного как коробка где-то просто происходит.

    В основном в Runloop, вы идете для обработки некоторых событий, а затем вернуться. Или вернуть, если он не выполняет каких-либо событий, прежде чем тайм-аут нажмите. Вы можете сказать, как и аналогичный асинхронный NSURLConnections, обработка данных в фоновом режиме, не мешая вашей текущей петли и но в то же время вы требуете данные синхронно. Что можно сделать с помощью Runloop, которые делают удержание из асинхронного NSURLConnection и получения данных на время разговора. Вы можете использовать Runloop следующим образом :-

    NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1]; while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil]) loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1]; 

    в этом Runloop он будет работать, пока вы не завершите некоторые ваши другие работы и набор YourBoolFlag на ложные.

    Аналогичным образом Вы можете использовать их в нити.

    Надеюсь, это поможет вам.