NSoperation и соблюдение ключевых значений

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

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

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

Может тут проблемы с синхронизацией в методеObservValue...?


person Infinite Possibilities    schedule 09.04.2010    source источник


Ответы (2)


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

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

person GilesB    schedule 24.03.2011
comment
NSOpertation, использующий KVO в своей реализации, является спорным вопросом; Я не говорю, что KVO — это плохо, я говорю, что уведомление — лучший выбор. Другие классы, использующие KVO, внезапно не делают все варианты использования KVO действительными. Использование KVO для этого привязывает вас исключительно к операциям, к знанию ключевых путей, к тому, чтобы стать наблюдателями, которые, в свою очередь, связывают ваши два класса вместе. С другой стороны, уведомление простое; разместить его в своей операции, дать ему данные, и что-то еще в приложении ... - person dannywartnaby; 18.05.2011
comment
Я предлагаю вам прочитать мой комментарий еще раз, я никогда не говорил и не подразумевал, что он делает все виды использования KVO действительными, я просто указал, что вы говорите, что нецелесообразно использовать KVO, что очень вводит в заблуждение. Подумайте о любом случае, когда вы использовали бы KVO вместо уведомлений; Уведомления являются крупнозернистыми и широковещательными, KVO подразумевает связь между двумя объектами. Подумайте о концепции операции, это атомарная часть работы, что-то создает ее, и что-то, вероятно, должно контролировать, что она делает и когда она завершена. если приложению нужно знать, что происходит, уведомить, если это делает только клиент, KVO - person GilesB; 19.05.2011

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

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

person dannywartnaby    schedule 09.04.2010
comment
С КВО все работает. Мне просто нужны проблемы, если они есть. Вы сказали, что есть некоторые проблемы. Можете ли вы указать, какие это? - person Infinite Possibilities; 09.04.2010
comment
Операция может быть отменена до вызова main. Таким образом, размещение уведомления требует дополнительной работы в некоторых случаях. - person Felix; 25.10.2010