Я получил несколько советов по использованию NSOperation
и рисованию:
У меня есть основной поток, создающий мой подкласс NSOperation
, который затем добавляет его в NSOperationQueue
.
My NSOperation
выполняет некоторую тяжелую обработку, он предназначен для циклического выполнения своего метода main () в течение нескольких минут, постоянно обрабатывая некоторую работу, но сейчас у меня просто есть цикл while () с sleep (1) внутри, который настроен на обход только 5 раз (для тестирования).
Основной (оригинальный) поток, который порождает этот NSOperation
, отвечает за отображение в представлении и обновление пользовательского интерфейса.
Я намеревался заставить поток NSOperation использовать уведомление, чтобы сообщить основному потоку, что он выполнил некоторую обработку, в данный момент это уведомление отправляется один раз каждый раз, когда проходит цикл while () (т. Е. Один раз в секунду).потому что он просто спит (1)).Основной поток (представление) регистрируется для получения этих уведомлений.
Уведомления сразу попадают в основной поток и выглядят асинхронно, выглядя просто отлично.Похоже, что оба потока работают как положено ... то есть - одновременно.(Я использую NSLog () просто для грубой проверки, когда каждый поток отправляет и получает уведомление).
Когда представление получает уведомление и вызывается его метод-обработчик, я просто увеличиваю целочисленную переменную и пытаюсьНарисуйте это для представления (как строка конечно).При тестировании код в drawRect: просто рисует это целое число (в виде строки) на экране.
Однако: вот моя проблема (извините, это заняло немного времени, чтобы добраться сюда): когда основной поток (view) получает уведомление от NSOperation, оно обновляет это целое число теста и вызывает [self setNeedsDisplay].Однако представление не перерисовывается, пока операция NSO не будет завершена!Я ожидал, что NSOperation, будучи отдельным потоком, не сможет блокировать цикл событий основного потока, но, похоже, именно это и происходит.Когда NSOperation завершается и его main () возвращается, представление, наконец, сразу перерисовывается.
Возможно, я неправильно использую NSOperation
.Я использую его в «неконкурентном» режиме, но, несмотря на название, я понимаю, что он по-прежнему создает новый поток и допускает асинхронную обработку.
Любая помощь или совет очень важны, если вы хотитечтобы увидеть код, просто дайте мне знать.