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