2009-09-08 2 views

ответ

7

AppKit не является потокобезопасным. Любые обновления объекта UI должны произойти на основной теме. KVO не отправляет наблюдательные сообщения по потокам. Таким образом, вам понадобится и еще один способ обновления индикатора прогресса, чем просто KVO.

В вашем методе вам необходимо периодически отправлять сообщения о ходе выполнения. Проще всего было бы использовать NSNotificationCenter с пользовательским уведомлением, чтобы основной поток мог прослушивать обновления. (Обратите внимание, что уведомления всегда отправляются на поток, из которого они были отправлены, поэтому вам необходимо использовать метод performSelectorOnMainThread:, чтобы убедиться, что уведомления доставляются в потоке пользовательского интерфейса.)

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

+0

В целом, это правильно, но обновления для NSProgressIndicator специально документированы как потокобезопасные. –

+0

@Barry Wark: У вас есть ссылка, я ничего не нашел в документации. –

+0

Могу ли я использовать 'perfomSelectorOnMainThread:' в ответ на сообщение KVO? –

0

Обертки Ben Copsey ASIHTTPRequest делают именно такие вещи.

Запрос является подклассом NSOperation, и вы можете передать ему индикатор прогресса при создании экземпляра.

Код доступен для вас, если вы хотите посмотреть, как он работает.

+2

Насколько я вижу, это нарушает шаблон MVC ... –

Смежные вопросы