Каково основное различие между NSTimer, NSTask, NSThread и NSRunloop?

Номер почтового ящика.

Это - информация, которая позволяет Вам получать доступ к чему-то еще.

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

27
задан Lorenzo B 31 March 2012 в 16:19
поделиться

3 ответа

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

Если у вас есть какой-то пользовательский интерфейс или другой код, который должен прослушивать события (например, сетевые порты), вам необходимо цикл выполнения . Каждый NSThread автоматически получает свой собственный цикл выполнения, и вам очень редко приходится заниматься им напрямую. Цикл выполнения также отвечает за создание и выпуск пулов автозапуска.

[РЕДАКТИРОВАТЬ: См. Комментарии для более подробного обсуждения пулов автозапуска. Самый важный момент, о котором следует помнить, - это то, что новые потоки должны позаботиться о настройке пула автозапуска. Например, методы, которые вызываются с помощью detachNewThreadSelector (см. Ниже), должны иметь следующие строки в качестве первой и последней:

   NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ];
   [code here]
   [pool release];

То же самое относится к потокам, созданным с использованием других методов.]

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

[NSThread detachNewThreadSelector:@selector(theSelector) toTarget:self withObject:nil];

Обмен данными между потоками может быть сложным, и вы должны знать о методах performSelector: onThread: withObject: waitUntilDone: и performSelectorOnMainThread : withObject: waitUntilDone: (Отличные советы по отправке NSNotifications по потокам здесь .)

Таймеры также обрабатываются циклами выполнения. В отличие от циклов выполнения, вы, вероятно, часто будете использовать таймеры непосредственно в своей программе. Самый простой способ создать таймер:

[self performSelector:@selector(aSelector) withObject:nil afterDelay:1.0];

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

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

Вы пометили свой вопрос с помощью «iphone», и на iPhone вы никогда не будете использовать NSTasks.

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

тогда нет причин использовать класс NSOperation. Но если вы будете регулярно генерировать задачи (например, общение с сервером), которые необходимо отслеживать, вам пригодятся NSOperation и NSOperationQueue.

тогда нет причин использовать класс NSOperation. Но если вы будете регулярно генерировать задачи (например, общение с сервером), которые необходимо отслеживать, вам пригодятся NSOperation и NSOperationQueue.

43
ответ дан 28 November 2019 в 05:08
поделиться

Другой ответы довольно хорошо суммируют таймеры, задачи и потоки. Я хотел немного прокомментировать NSRunloop, так как я думаю, что большинство других ответов все еще оставляют здесь некоторую путаницу. Из документации NSRunloop:

Объект NSRunLoop обрабатывает ввод для таких источников, как мышь и клавиатура события из оконной системы, NSPort объекты и объекты NSConnection. An Объект NSRunLoop также обрабатывает События NSTimer.

также

Как правило, ваше приложение не нужно либо создать, либо явно управлять объектами NSRunLoop. Каждый Объект NSThread, включая основной поток приложения, имеет Объект NSRunLoop создается автоматически для этого по мере необходимости. Если вам нужно получить доступ к циклу выполнения текущего потока, вы делаете это с помощью метода класса currentRunLoop.

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

3
ответ дан 28 November 2019 в 05:08
поделиться
  • NSTimer - это объект таймера, способ вызвать селектор для объекта в будущем.
  • NSThread - это класс потока. Я полагаю, вы знаете, что такое поток.
  • NSTask - это класс процесса, способ запустить другую программу из вашей программы.
  • NSOperation (я добавляю к вопросу) очень красивая абстракция для единственной задачи. Вы встраиваете свою операцию в этот класс, и вы можете легко выполнять ее одновременно с помощью класса NSOperationQueue .
  • NSRunLoop - самый сложный для понимания. В некотором роде абстрагируется и адаптируется системный вызов unix select () , управляющий источниками ввода и диспетчеризация событий и таймеров в потоке.

Рекомендация - Apple Threading Programming Guide .

4
ответ дан 28 November 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: