NSoperation и наблюдение значения ключа - PullRequest
1 голос
/ 09 апреля 2010

Я создаю объект MyOperation (унаследованный от NSOperation) и добавляю в NSOperationQueue. Затем я делаю КВО на MyOperation. Я использую этот метод

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

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

Может быть, здесь проблемы с синхронизацией в методе наблюденияВ ... ... 1006 *

Ответы [ 2 ]

12 голосов
/ 24 марта 2011

У меня недостаточно репутации, чтобы комментировать или голосовать против, но я бы проголосовал против Дэннивартнаби. NSOperation использует KVO по своей природе в своей работе; необходимость реализации isFinished и isExecuted как часть обработки, например, составляет 100% КВО и является частью требуемого контракта операции с клиентом / очередью. Поэтому советовать, что их следует избегать, неточно; NSOperation использует само KVO, поэтому принятие предпосылки dannywartnaby будет означать, что реализация NSOperation сама по себе несовершенна, что, безусловно, не так.

По общему признанию, разработчик должен позаботиться о том, чтобы правильно использовать KVO, хотя я бы сказал, что создание подклассов NSOperation - нетривиальная задача, вероятно, оставленная для более опытного программиста Objective-C. Можно было бы возразить, что уведомления слишком грубы для той работы, которую выполняет операция, хотя и не всегда, я думаю, что мы должны быть осторожны при консультировании по методам, чтобы гарантировать, что неправильное сообщение не будет передано в качестве наилучшей практики. Дэнни, не могли бы вы пояснить, почему не рекомендуется использовать KVO при использовании NSOperation или потоков? множество примеров реализации NSOperation используют KVO ...

0 голосов
/ 09 апреля 2010

Я не знаю ваш вариант использования, но использование KVO для потоков / операций нецелесообразно.

Вместо этого вы можете сделать так, чтобы ваш объект Operation опубликовал уведомление после его завершения. Или, альтернативно, определите протокол делегата и дайте вашей Операции делегат ... затем вы можете определить какой-то метод myOperationComplete:, который вызывается вашей Операцией для делегата, которому он был предоставлен, используя executeSelectorOnMainThread.

...