NSCondition
NSCondition
класс реализует условную переменную, семантика которой следуют за используемыми для условий стиля POSIX. Объект условия действует и как блокировка и как контрольная точка в данном потоке. Блокировка защищает Ваш код, в то время как это тестирует условие и выполняет задачу, инициированную условием. Поведение контрольной точки требует, чтобы условие было истиной перед доходами потока с его задачей. В то время как условие не является истиной, блоками потока. Это остается блокированным, пока другой поток не сигнализирует объект условия.
Семантика для использования NSCondition
объект следующие:
Заблокируйте объект условия.
Протестируйте булев предикат. (Этот предикат является булевым флагом или другой переменной в Вашем коде, указывающем, безопасно ли выполнить задачу, защищенную условием.)
Если булев предикат является ложью, вызовите объект условия
wait
илиwaitUntilDate:
метод для блокирования потока. После возврата из этих методов перейдите к шагу 2, чтобы повторно протестировать Ваш булев предикат. (Продолжайте ожидать и повторно тестировать предикат, пока это не будет истина.)Если булев предикат является истиной, выполните задачу.
Дополнительно обновите любые предикаты (или сигнализируйте любые условия), затронутый Вашей задачей.
Когда Ваша задача будет сделана, разблокируйте объект условия.
Псевдокод для выполнения предыдущих шагов поэтому посмотрел бы что-то как следующее:
lock the condition
while (!(boolean_predicate)) {
wait on condition
}
do protected work
(optionally, signal or broadcast the condition again or change a predicate value)
unlock the condition
Каждый раз, когда Вы используете объект условия, первый шаг должен заблокировать условие. Блокировка условия гарантирует, что Ваш предикат и код задачи защищены от интерференции другими потоками с помощью того же условия. Как только Вы выполнили свою задачу, можно установить другие предикаты или сигнализировать другие условия на основе потребностей кода. Необходимо всегда устанавливать предикаты и сигнальные условия при содержании блокировки объекта условия.
Когда поток ожидает на условии, объект условия разблокировал свою блокировку и блокирует поток. Когда условие сообщено, система будит поток. Объект условия тогда повторно получает свою блокировку прежде, чем возвратиться из wait
или waitUntilDate:
метод. Таким образом, с точки зрения потока, это - как будто это всегда содержало блокировку.
Булев предикат является важной частью семантики использования условий из-за способа, которым работает сигнализация. Сигнализация условия не гарантирует, что само условие является истиной. Там синхронизируют проблемы, вовлеченные в сигнализацию, которая может заставить ложные сигналы появляться. Используя предикат гарантирует, чтобы эти ложные сигналы не заставляли Вас выполнять работу, прежде чем будет безопасно сделать так. Сам предикат является просто флагом или другой переменной в Вашем коде, который Вы тестируете для получения булева результата.
Для получения дополнительной информации о том, как использовать условия, посмотрите Используя Поток POSIX, Привязывает Руководство по программированию Поточной обработки.
Соответствует
-
AnyObject
-
CVarArgType
-
Сопоставимый
-
Hashable
-
NSLocking
-
NSObjectProtocol
-
Печатаемый
-
NSLocking
-
NSObject
Оператор импорта
Swift
import Foundation
Objective C
@import Foundation;
Доступность
Доступный в OS X v10.5 и позже.
-
Блокирует текущий поток, пока не сообщено условие.
Объявление
Swift
func wait()
Objective C
- (void)wait
Обсуждение
Необходимо заблокировать получатель до вызова этого метода.
Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.5 и позже.
См. также
– lock
(NSLocking
) -
Блокирует текущий поток, пока условие не сообщено, или предел требуемого времени достигнут.
Объявление
Swift
func waitUntilDate(_
limit
: NSDate) -> BoolObjective C
- (BOOL)waitUntilDate:(NSDate *)
limit
Параметры
limit
Время, в которое можно разбудить поток, если не было сообщено условие.
Возвращаемое значение
YES
true
если было сообщено условие; иначе,NO
false
если было достигнуто ограничение по времени.Обсуждение
Необходимо заблокировать получатель до вызова этого метода.
Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.5 и позже.
См. также
– lock
(NSLocking
)
-
Сигнализирует условие, будя один поток, ожидающий на нем.
Объявление
Swift
func signal()
Objective C
- (void)signal
Обсуждение
Вы используете этот метод для пробуждения одного потока, ожидающего на условии. Можно вызвать этот метод многократно для пробуждения многократных потоков. Если никакие потоки не ожидают на условии, этот метод ничего не делает.
Для предотвращения условий состязания необходимо вызвать этот метод только, в то время как заблокирован получатель.
Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.5 и позже.
-
Сигнализирует условие, будя все потоки, ожидающие на нем.
Объявление
Swift
func broadcast()
Objective C
- (void)broadcast
Обсуждение
Если никакие потоки не ожидают на условии, этот метод ничего не делает.
Для предотвращения условий состязания необходимо вызвать этот метод только, в то время как заблокирован получатель.
Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.5 и позже.
-
Имя условия.
Обсуждение
Можно использовать строку имени для идентификации объекта условия в коде. Какао также использует это имя в качестве части любых описаний ошибок, включающих условие.
Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.5 и позже.