kvc что это такое
Kvc что это такое
Пропускная способность Kvs. Что это такое?
Kvs и пропускная способность синонимы.
Kvs = Пропускная способность.
Выражаясь так…: У некоторого клапана Kvs = 1,5 м3/час равносильно тому, как если бы Вы выразились, что у клапана пропускная способность равна 1,5 м3/час. В некоторых таблицах и паспортах любых гидравлических элементов(клапанов) могут указывать так:
Пропускная способность (Kvs) показывает значение гидравлического сопротивления. Отсюда и его определение.
Kvs – это форма выражения гидравлического сопротивления, которая характеризует пропускную способность. Значение пропускной способности присваивается практически всем элементам, которые участвуют в протекании в них жидкости или газа.
На стадии проектирования, проектанту обязательно необходимо знать пропускную способность любого гидравлического оборудования или клапана. От этого будет зависеть все необходимые расчеты для всей системы цепи, например системы отопления.
В чем измеряется пропускная способность?
Так договорились и присвоили единицу измерения: м3/час. (метр кубический в час). Это значение показывает расход. Например, расход клапана. Но это не просто расход, а расход, при котором на клапане возникает потеря напора равная 1 Bar.
Расход – это протекание определенного объема жидкости или газа в единицу времени. В данном случае расход м3/час. Означает, что будет протекать 1 кубометр жидкости или газа в 1 час времени. То есть за два часа пройдет 2 кубометра жидкости или газа. За половину часа пройдет 0,5 метров кубических = 500 литров.
Например, рассмотрим термостатический клапан Kvs которого равен 1,2 м3/час.
То есть, если мы через клапан пропустим 1,2 м3/час, то потеря составит 1 Bar.
Насос выдает расход ровно 1,2 м3/час
Манометр 1, показывает 1,4 Bar
Манометр 2, показывает 0,4 Bar
Конечно, это не означает, что расход в клапане должен быть таким всегда. В большинстве случаев расход очень маленький. И возникают другие задачи:
Как найти потерю напора при малых расходах?
Существует формула перерасчета
Где P – потеря напора, Bar
Q – фактический, другой расход, м3/час
Kvs – пропускная способность, м3/час при котором потеря напора 1 Bar.
Имеется термостатический клапана пропускной способностью 1,2 м3/час.
Найти потерю напора при расходе 0.18 м3/час.
Ответ: Потеря напора составляет 0,0225 Bar.
В некоторых случаях можно найти аббревиатуры типа Kv. Такой аббревиатурой могут обозначать дополнительные функции пропускных способностей.
Например, некоторые клапаны имеют различные регулировки.
Отдельную регулировку могут обозначить как: Kv
Обычно Kvs показывает значение пропускной способности полностью открытого клапана. А Kv для определенного изменения положения клапана.
К сожалению, эта аббревиатура иностранного происхождения и не известна ее история зарождения.
Пропускная способность Kvs с точки зрения точной математики присваивается в основном тем элементам, у которых гидравлическое сопротивление образовано только местными сопротивлениями. Подробнее здесь.
Но на практике и в целом в мире это не так, потому что пропускную способность можно присвоить даже котловому оборудованию имеющее в себе участки различных труб. Поэтому перерасчет расходов может быть только приблизительным. Потому что с точки зрения гидравлических расчетов формулы разные для трубопровода и клапанов. Но в целом сопротивления примерно одинаково пропорциональны. Если нужны более точные гидравлические расчеты, то изучайте гидравлику.
Русские Блоги
Использование и принцип работы КВЦ и КВО
О KVC
Что такое KVC?
Кодирование «ключ-значение», а именно кодирование «ключ-значение». Это механизм для косвенного доступа к атрибутам через строки имен атрибутов, а не методы доступа.
KVC часто используемые методы
KVC поддерживает несколько типов данных
Прежде всего следует сказать, что для атрибутов базовых типов данных эти методы KVC будут автоматически упаковывать и распаковывать.
Во-вторых, KVC также поддерживает агрегированные данные, такие как массивы и словари. Здесь не так много дискуссий. Вы можете прочитать это сообщение в блоге об этих знаниях:Принципы KVC / KVO подробное объяснение и руководство по программированию
Принцип KVC: Как KVC атрибуты доступа?
, и если да, используйте эти методы напрямую;
2. Если нет, продолжайте поиск _
и другие методы, если они доступны, используйте их;
3. Если ни один из вышеперечисленных методов доступа не найден, попробуйте получить прямой доступ к переменной экземпляра
;
4. Если невозможно получить доступ даже к переменной-члену, в следующем методе будет сгенерировано исключение.Причина предоставления этих двух методов заключается в том, чтобы позволить вам переписать до того, как программа вот-вот выйдет из строя, потому что вы не можете получить доступ к свойству, и выполнить некоторую обработку, чтобы предотвратить непосредственный сбой программы.
valueForUndefinedKey: с участием setValue:forUndefinedKey: метод.
О КВО
Что такое КВО?
Как пользоваться КВО?
1. Сначала добавьте наблюдения к атрибутам целевого объекта:
2. Реализуйте следующие методы для получения уведомлений, нужно обращать внимание на значение каждого параметра:
3. Наконец, удалите наблюдателя:
Следует отметить, что в приведенном выше коде лучше всего оценивать целевой объект и путь атрибута в методе получения уведомлений, поскольку может быть несколько KVO для наблюдения за атрибутами нескольких объектов; кроме того, родительский класс также может использовать KVO, поэтому в else Здесь ситуация за пределами существующих условий передается родительскому классу для обработки.
Принцип КВО: Как реализуется КВО?
Когда объект определенного класса наблюдается в первый раз, система динамически создает производный класс этого класса во время выполнения и переопределяет метод установки наблюдаемого свойства в базовом классе в этом производном классе. В методе установки Сделайте так, чтобы у него был механизм уведомлений. следовательноЧтобы KVO вступил в силу, вы должны прямо или косвенно получить доступ к свойствам через метод установки (setValue KVC является косвенным методом). Прямой доступ к переменной-члену KVO неэффективен.
В то же время производный класс также переопределяет метод класса, чтобы «обмануть» внешние вызывающие объекты, считая, что это исходный класс. Затем система указывает указатель isa этого объекта на этот только что родившийся производный класс, поэтому этот объект становится объектом этого производного класса, поэтому вызов установщика этого объекта вызовет переопределенный установщик, тем самым активируя уведомление о значении ключа. механизм. Кроме того, производный класс также переопределяет метод dealloc для освобождения ресурсов.
Что именно сделал новый метод установки, чтобы у него был механизм уведомления? Фактически, в методе установки два метода вызываются до и после присвоения атрибута.
Это основной принцип реализации KVO!
Когда нет метода доступа и значение атрибута изменяется с помощью setValue KVC, два вышеуказанных метода также будут вызываться по умолчанию в методе setValue: forKey во время выполнения.
** Фактически, мы также можем вручную и явно вызвать эти два метода, чтобы у них был механизм уведомления. **
Следующий пример используется для проверки:
Русские Блоги
Подробный iOS KVC и KVO
KVC определение
Кодирование ключ-значение KVC (кодирование значения ключа) означает, что при разработке iOS разработчики могут напрямую обращаться к атрибутам объекта через имя ключа или присваивать значения атрибутам объекта. Нет необходимости вызывать явные методы доступа. Это позволяет вам динамически получать доступ и изменять свойства объекта во время выполнения. Вместо определения во время компиляции, это также одна из черных магий в разработке iOS. Многие передовые методы разработки iOS основаны на KVC.
В классе, реализующем метод доступа, нет большой разницы между использованием точечного синтаксиса и KVC для доступа к объектам, и они могут быть смешаны по желанию. Но в классе без метода доступа точечный синтаксис использовать нельзя, тогда KVC имеет преимущество.
Определение KVC реализовано расширением NSObject. В Objective-C есть явное имя категории NSKeyValueCoding, поэтому для всех типов, наследующих NSObject, можно использовать KVC (некоторые чистые классы и структуры Swift не поддерживают KVC, поскольку он не наследует NSObject), вот четыре наиболее важных метода KVC:
Некоторые другие методы в категории NSKeyValueCoding:
В то же время у Apple есть специальная реализация KVC для некоторых классов контейнеров, таких как NSArray или NSSet.
Соответствующие методы для упорядоченных наборов следующие:
Соответствующие методы для неупорядоченных множеств следующие:
Объясните технические концепции и использование KVC в следующих аспектах:
Технические концепции, связанные с KVC
Настройка KVC
Чтобы установить значение для KVC, необходим соответствующий ключ в объекте.В каком порядке KVC ищет ключи внутри? При вызове кода setValue: значение атрибута forKey: @ «name» базовый механизм выполнения выглядит следующим образом:
Программа сначала вызывает метод set: property value, а код завершает настройку с помощью метода setter. Обратите внимание, что здесь относится к имени переменной-члену, регистр первой буквы должен соответствовать правилам именования KVC, таким же, как показано ниже.
Если метод setName: не найден, механизм KVC проверит, возвращает ли метод + (BOOL) accessInstanceVariablesDirectly YES. По умолчанию этот метод возвращает YES. Если вы переопределите этот метод, чтобы вернуть NO, то KVC выполнит setValue на этом шаге. : ForUndefinedKey: метод, но средний разработчик не стал бы этого делать. Следовательно, механизм KVC будет искать переменную-член с именем _ в классе, независимо от того, определена ли переменная в интерфейсе класса или в реализации класса, и независимо от того, какой модификатор доступа используется, он будет существовать только с _ Для именованных переменных KVC может присваивать значения переменным-членам.
Если в классе нет метода set: и переменной _member, механизм KVC будет искать переменные-члены _is.
Как и выше, если у класса нет set: method и переменных-членов _ и _is, механизм KVC продолжит поиск переменных-членов. Присвойте им ценности.
Если ни один из перечисленных выше методов или переменных-членов не существует, система выполнит setValue: forUndefinedKey: метод объекта, а по умолчанию будет выдано исключение.
Проще говоря Если метод Set не найден, элементы будут найдены и назначены в порядке _key, _iskey, key, iskey. 。
Если разработчик хочет отключить этот класс в KVC, переопределите метод + (BOOL) accessInstanceVariablesDirectly, чтобы вернуть NO. В этом случае, если KVC не находит имя свойства set:, он будет напрямую использовать метод setValue: forUndefinedKey:.
Посмотрим на пример:
Давайте посмотрим на эффект установки accessInstanceVariablesDirectly на NO:
Видно, что когда accessInstanceVariablesDirectly имеет значение NO, KVC будет запрашивать только уровни установщика и получателя, а выполнение связанных переменных, которые ищут ключ ниже, будет остановлено, и об ошибке будет сообщено напрямую.
Установите для параметра accessInstanceVariablesDirectly значение YES, затем измените _name на _isName, чтобы увидеть, успешно ли выполнено.
Из распечатки видно, что для accessInstanceVariablesDirectly установлено значение YES, KVC продолжит поиск по порядку, успешно установит и примет значение.
KVC значение
Когда вызывается код valueForKey: @ «name», метод поиска KVC для ключа отличается от setValue: значение атрибута дляKey: @ «name», метод поиска выглядит следующим образом:
Сначала найдите метод получения в порядке получения и есть и вызовите его напрямую, если он найден. Если это тип значения, такой как BOOL или Int, он будет упакован в объект NSNumber.
Если указанный выше геттер не найден, KVC будет искать методы в формате countOf, objectInAtIndex или AtIndexes. Если будут найдены метод countOf и один из двух других методов, он вернет коллекцию прокси, которая может отвечать на все методы NSArray (это NSKeyValueArray, подкласс NSArray), вызовет метод сбора прокси или предоставит это Когда коллекция прокси отправляет методы, принадлежащие NSArray, она будет вызываться в форме комбинации countOf, objectInAtIndex или AtIndexes. Также существует необязательный метод get: range:. Итак, вы хотите переопределить некоторые функции KVC. Вы можете добавить эти методы. Следует отметить, что имя вашего метода должно соответствовать стандартному методу именования KVC, включая сигнатуры методов.
Если указанный выше метод не найден, он также будет искать методы в форматах countOf, enumeratorOf и memberOf. Если эти три метода найдены, то возвращается коллекция прокси, которая может отвечать на методы NSSet. Как указано выше, сообщение NSSet, отправленное в эту коллекцию прокси, будет вызываться в форме комбинации countOf, enumeratorOf и memberOf.
Добавьте метод getAge в класс Test, например, следующим образом:
Давайте изменим getAge на age, пример следующий:
Давайте изменим getAge на isAge, пример следующий:
Приведенный выше код показывает, что KVC звонит valueforKey:@»age» Механизм поиска ключа по времени.
KVC использует keyPath
В процессе разработки переменная-член класса может быть настраиваемым классом или другими сложными типами данных. Вы можете сначала использовать KVC, чтобы получить атрибут, а затем снова использовать KVC, чтобы получить атрибут этого настраиваемого класса, Но это более громоздко. Для этого KVC предлагает решение, то есть keyPath пути к ключу. Как следует из названия, найти ключ по пути.
Код реализован следующим образом:
Исключение обработки KVC
Наиболее частым исключением в KVC является случайное использование неправильного ключа или случайная передача значения nil в настройках. В KVC есть специальные методы для обработки этих исключений.
KVC обрабатывает нулевое исключение
В нормальных условиях KVC не позволяет передавать значение nil не-объекту при вызове setValue: значение атрибута forKey: (или keyPath). Очень просто, потому что тип значения не может быть нулевым. Если вы случайно передадите его, KVC вызовет метод setNilValueForKey :. По умолчанию этот метод генерирует исключение, поэтому в общем случае лучше переопределить этот метод.
Код реализован следующим образом:
KVC обрабатывает исключение UndefinedKey
В нормальных условиях KVC не позволяет вам работать с ключами, которые не существуют, при вызове setValue: значение атрибута forKey: (или keyPath). В противном случае будет сообщено об ошибке, что forUndefinedKey приведет к сбою. Переопределите метод forUndefinedKey, чтобы избежать сбоя.
KVC обрабатывает атрибуты типа значения и структуры
Не каждый метод возвращает объект, но valueForKey: всегда возвращает объект id.Если исходный тип переменной является типом или структурой значения, возвращаемое значение будет инкапсулировано в объект NSNumber или NSValue. Эти два класса будут обрабатывать все, от чисел, логических значений до указателей и структур. Затем открывалку нужно вручную преобразовать в исходный тип. Хотя valueForKey: автоматически инкапсулирует тип значения в объект, setValue: forKey: не работает. Вы должны вручную преобразовать тип значения в тип NSNumber или NSValue перед его передачей. Поскольку тип идентификатора передается и отправляется, разработчик должен гарантировать правильность типа. Objective-C проверит тип при отправке сообщения во время выполнения, и если он неверен, он будет напрямую Выбросить исключение.
Например, класс Person имеет атрибут возраста типа NSInteger, как показано ниже:
Изменить значение
Мы используем технологию KVC, чтобы установить значение атрибута age следующим образом:
Мы назначаем age объект NSNumber.KVC автоматически преобразует объект NSNumber в объект NSInteger, а затем вызовет соответствующий метод доступа для установки значения age.
Получите ценность
Аналогичным образом получите значение атрибута age следующим образом:
В это время значение возраста будет возвращено в форме NSNumber.
Результат печати: 2017-01-16 16: 31: 55.709 Тест [28586: 2294177] age = 5
Следует отметить, что мы не можем напрямую присвоить значение через KVC. Нам нужно передать данные в типы NSNumber и NSValue. Затем, какие типы данных следует инкапсулировать с помощью NSNumber и какие типы данных следует инкапсулировать с помощью NSValue? Посмотрите на типы параметров этих методов ниже:
Типы данных, которые могут использовать NSNumber:
Это некоторые общие числовые данные.
Типы данных, которые могут использовать NSValue:
NSValue в основном используется для обработки структурированных данных и сам обеспечивает поддержку указанной выше централизованной структуры. Любая структура может быть преобразована в объект NSValue, включая другие настраиваемые структуры.
Проверка значения ключа KVC (проверка значения ключа)
KVC предоставляет метод проверки доступности значения, соответствующего ключу:
Реализация по умолчанию этого метода заключается в вызове метода в следующем формате:
Это дает нам шанс исправить ошибки. Следует отметить, что KVC не вызывает автоматически метод проверки значения ключа, а это означает, что, если нам нужна проверка значения ключа, нам нужно проверить его вручную. Но некоторые технологии, например CoreData, будут вызываться автоматически.
Комплект обработки KVC
KVC также предоставляет очень сложные функции, в основном следующие:
Оператор простого множества
Существует 5 типов простых операторов набора: @avg, @count, @max, @min и @sum. Просто посмотрите следующие примеры, чтобы понять, что они означают. Настройка в настоящее время не поддерживается.
Результат печати: 2018-05-05 17: 04: 50.674243 + 0800 KVCKVO [35785: 6351239] сумма: 100.000000 2018-05-05 17 : 04: 50.675007 + 0800 KVCKVO [35785: 6351239] в среднем: 25.000000 2018-05-05 17: 04: 50.675081 + 0800 KVCKVO [35785: 6351239] количество: 4.000000 2018-05-05 17: 04: 50.675146 + 0800 KVCKVO [35785: 6351239] мин: 10.000000 2018-05-05 17: 04: 50.675204 + 0800 KVCKVO [35785: 6351239] макс: 40,000000
Оператор объекта
Немного более сложный, чем оператор set, он может возвращать указанное содержимое в виде массива. Существует два типа:
Результат печати: 2018-05-05 17: 06: 21.832401 + 0800 KVCKVO [35798: 6358293] independentUnionOfObjects 2018-05-05 17:06 : 21.833079 + 0800 KVCKVO [35798: 6358293] 10.000000 2018-05-05 17: 06: 21.833112 + 0800 KVCKVO [35798: 6358293] 20.000000 2018-05-05 17:06: 21.833130 + 0800 KVCKVO [35798: 6358293] 30.000000 2018-05-05 17: 06: 21.833146 + 0800 KVCKVO [35798: 6358293] 40.000000 2018-05-05 17: 06: 21.833165 + 0800 KVCKVO [35798: 6358293] unionOfObjects 2018-05-05 17: 06: 21.833297 + 0800 KVCKVO [35798: 6358293] 40.000000 2018-05-05 17:06: 21.833347 + 0800 KVCKVO [35798: 6358293] 20.000000 05.05.2018 17: 06: 21.833371 + 0800 KVCKVO [35798: 6358293] 30.000000 2018-05-05 17: 06: 21.833388 + 0800 KVCKVO [35798: 6358293] 10.000000
Словарь обработки KVC
При использовании KVC для объектов NSDictionary valueForKey: ведет себя так же, как objectForKey :. Следовательно, для доступа к многоуровневым вложенным словарям удобнее использовать valueForKeyPath:.
Есть еще два метода NSDictionary в KVC:
DictionaryWithValuesForKeys: относится к вводу набора ключей, возврату атрибутов, соответствующих этому набору ключей, а затем формированию словаря. setValuesForKeysWithDictionary используется для изменения атрибутов соответствующего ключа в модели. Будет более интуитивно понятно использовать приведенный ниже код:
Результат печати: 2018-05-05 17:08: 48.824653 + 0800 KVCKVO [35807: 6368235] < city = "Shen Zhen"; country = China; District = "Nan Shan"; Province = "Guang Dong"; >2018-05-05 17: 08: 48.825075 + 0800 KVCKVO [35807: 6368235] страна: провинция США: город калифорнии: угол Лос-Анджелеса
Напечатанный результат в точности соответствует ожиданиям.
KVC использование
Динамически принимать и устанавливать значения
Используйте KVC для доступа и изменения частных переменных
Для частных свойств в классе Objective-C не может получить прямой доступ, но KVC может.
Преобразование модели и словаря
Это еще одно проявление мощной функции KVC. Комбинация времени выполнения KVC и Objc может легко конвертировать между моделью и словарем.
Измените внутренние свойства некоторых элементов управления
Это также важный навык в разработке для iOS. Как мы все знаем, многие элементы управления пользовательского интерфейса состоят из множества внутренних элементов управления пользовательского интерфейса, но Apple не предоставляет API-интерфейсы для доступа к этим элементам управления, поэтому мы не можем получить доступ и изменить стили этих элементов управления обычным образом. И KVC может решить эту проблему в большинстве случаев. Чаще всего используется placeHolderText в персонализированном UITextField.
Набор операций
Apple разработала несколько специальных реализаций метода valueForKey: KVC. Например, эти методы реализуют такие классы контейнеров, как NSArray и NSSet. Таким образом, вы можете использовать KVC, чтобы легко управлять коллекцией.
Используйте KVC для передачи сообщений высокого уровня
При использовании KVC для класса контейнера valueForKey: будет передаваться каждому объекту в контейнере, а не самому контейнеру для работы. Результат будет добавлен в возвращенный контейнер, чтобы разработчики могли легко манипулировать коллекцией для возврата другой коллекции.
Результат печати: 2018-05-05 17: 16: 21.975983 + 0800 KVCKVO [35824: 6395514] Английский 2018-05-05 17:16 : 21.976296 + 0800 KVCKVO [35824: 6395514] Franch 2018-05-05 17: 16: 21.976312 + 0800 KVCKVO [35824: 6395514] Китайский 2018-05-05 17: 16: 21.976508 + 0800 KVCKVO [35824: 6395514] 7 2018-05-05 17: 16: 21.976533 + 0800 KVCKVO [35824: 6395514] 6 2018-05-05 17: 16: 21.976550 + 0800 KVCKVO [35824: 6395514] 7
Метод capitalizedString передается каждому элементу в NSArray, так что каждый член NSArray будет выполнять capitalizedString и возвращать новый NSArray, содержащий результат. Из напечатанного результата мы видим, что все строки были успешно преобразованы в верхний регистр. Аналогичным образом, если вы хотите выполнить несколько методов, вы также можете использовать метод valueForKeyPath :. Сначала он вызывает метод capitalizedString для каждого члена, а затем вызывает length.Поскольку метод lenth возвращает число, возвращенный результат сохраняется в новом массиве в форме NSNumber.
Внедрить КВО
KVO реализован на базе KVC.Поговорим о концепции и реализации KVO.
KVO определение
KVO означает наблюдение за ключом, что переводится как наблюдение за ключом. Это производная от модели наблюдателя. Основная идея состоит в том, чтобы добавить наблюдение к определенному атрибуту целевого объекта, и когда атрибут изменяется, наблюдатель автоматически уведомляется путем запуска метода интерфейса KVO, реализованного объектом-наблюдателем.
Что такое шаблон наблюдателя? Целевой объект управляет всеми объектами-наблюдателями, которые зависят от него, и активно информирует объект-наблюдатель при изменении его собственного состояния. Это активное уведомление обычно реализуется путем вызова методов интерфейса, предоставляемых каждым объектом-наблюдателем. Режим наблюдателя отлично отделяет целевой объект от объекта-наблюдателя.
Проще говоря, KVO может получить изменение значения, отслеживая ключ, который используется для отслеживания изменений состояния между объектами. Определение KVO реализуется расширением NSObject. В Objective-C есть явное имя категории NSKeyValueObserving, поэтому для всех типов, наследующих NSObject, можно использовать KVO (некоторые чистые классы и структуры Swift не поддерживают KVC, потому что он не наследует NSObject).
КВО использовать
Регистрация и снятие с учета
Если у нас уже есть класс, содержащий свойства наблюдения «ключ-значение», то мы можем зарегистрировать и отменить регистрацию объекта-наблюдателя и наблюдаемого объекта, вызвав метод категории с именем NSKeyValueObserverRegistration для объекта этого класса (наблюдаемого объекта) :
Что входит в опции
Эти два метода определены в Foundation / NSKeyValueObserving.h. Все NSObject, NSArray и NSSet реализуют вышеуказанные методы, поэтому мы можем не только наблюдать за обычными объектами, но и с объектами массивов или комбинированных классов. В файле заголовка мы также можем видеть, что NSObject также реализует метод категории NSKeyValueObserverNotification (для более похожих методов, пожалуйста, проверьте файл заголовка NSKeyValueObserving.h):
Эти два метода будут использоваться при ручном выполнении наблюдения за ключевым значением. Обратите внимание: когда вы не используете, не забудьте отменить регистрацию, иначе это вызовет утечку памяти.
Уведомление об изменении обработки
Всякий раз, когда отслеживаемый keyPath изменяется, он будет вызываться в этой функции.
Здесь словарь изменений сохраняет информацию об изменении.Конкретная информация зависит от NSKeyValueObservingOptions во время регистрации.
Ручной KVO (KVO отключен)
Реализация KVO заключается в автоматической реализации двух функций в зарегистрированном keyPath, которые автоматически вызываются в установщике.
Может быть, иногда нам нужно реализовать ручной KVO, или библиотека классов, которую мы реализуем, не хочет быть KVO. В настоящее время вам нужно отключить автоматическое создание уведомлений KVO, а затем вызывать их вручную. Преимущество ручного уведомления заключается в том, что вы можете гибко добавлять необходимые условия оценки. Давайте посмотрим на пример следующим образом:
Во-первых, вам необходимо вручную реализовать метод установки свойства и вызвать методы willChangeValueForKey: и didChangeValueForKey до и после операции установки. Эти два метода используются для уведомления системы о приближении значения ключевого свойства и его изменении; Во-вторых, реализуйте метод класса automaticNotifiesObserversForKey и настройте его так, чтобы он не отправлял уведомления ключу автоматически (просто верните NO). Здесь следует отметить, что для других ключей, которые не реализованы вручную, они должны быть переданы в super для обработки. Если вам нужно __ отключить этот тип KVO__, напрямую автоматическиNotifiesObserversForKey возвращает NO, реализует метод установки свойства и не вызывает методы willChangeValueForKey: и didChangeValueForKey.
Наблюдение за ключом и значением зависит от ключа
Иногда значение атрибута зависит от одного или нескольких атрибутов в другом объекте.Если значение любого из этих атрибутов изменяется, значение зависимого атрибута также должно быть отмечено для его изменения. Следовательно, объект вводит зависимые ключи.
Соблюдайте зависимые ключи
Способ наблюдения за зависимыми ключами такой же, как и описанный выше. Во-первых, добавьте код для обработки уведомлений об изменениях в Observer ObserverValueForKeyPath: ofObject: change: context ::
Реализуйте зависимые ключи
Здесь вы наблюдаете за информационным свойством класса TargetWrapper, которое зависит от свойств класса Target и возраста. Для этого я добавил в Target атрибут оценки:
Давайте посмотрим, как реализовано свойство ключа зависимости в TragetWrapper.
Во-первых, вручную реализуйте метод установки / получения информации о свойстве, в котором свойство Target используется для завершения его средства установки и получения.
Во-вторых, реализуйте метод keyPathsForValuesAffectingInformation или keyPathsForValuesAffectingValueForKey:, чтобы сообщить системе, от каких других атрибутов зависит это информационное свойство. Оба метода возвращают коллекцию путей ключа. Я хочу сказать здесь еще несколько слов. Если вы решите реализовать keyPathsForValuesAffectingValueForKey, вы должны сначала получить набор результатов, возвращаемый super, а затем определить, является ли ключ целевым ключом, и если да, добавьте комбинацию пути ключа зависимого атрибута к набору результатов, возвращенному super В противном случае верните результат super напрямую.
Здесь атрибут информации зависит от атрибутов возраста и класса цели. Любое изменение в атрибутах возраста / класса цели будет уведомлять наблюдателя об этой информации.
КВО и темы
Поэтому, когда мы пытаемся изменить значения атрибутов из других потоков, мы должны быть очень осторожны, если только мы не можем быть уверены, что все наблюдатели обрабатывают уведомления KVO поточно-безопасным способом. Вообще говоря, мы не рекомендуем смешивать KVO с многопоточностью. Если мы собираемся использовать несколько очередей и потоков, мы не должны использовать KVO между ними.
Во-первых, если мы вызовем метод установки, поддерживающий KVO, как показано ниже:
KVO может гарантировать, что все наблюдатели exchangeRate будут уведомлены перед возвратом метода установки.
Внедрение КВО
KVO реализуется через isa-swizzling. Основной процесс заключается в том, что компилятор автоматически создает производный класс для наблюдаемого объекта и указывает isa наблюдаемого объекта на этот производный класс. Если пользователь регистрирует наблюдение за определенным атрибутом определенного целевого объекта, то этот производный класс переопределит этот метод и добавит к нему код уведомления. Когда Objective-C отправляет сообщение, он найдет объект класса, которому принадлежит текущий объект, через указатель isa. Объект класса хранит метод экземпляра текущего объекта, поэтому при отправке сообщения этому объекту оно фактически отправляется методу объекта производного класса. Поскольку компилятор переопределяет методы производного класса и добавляет код уведомления, он будет отправлять уведомления зарегистрированным объектам. Обратите внимание, что производный класс переопределяет только метод атрибута зарегистрированного наблюдателя.
Описание официального документа Apple выглядит следующим образом:
Key-Value Observing Implementation Details
Automatic key-value observing is implemented using a technique called isa-swizzling.
The isa pointer, as the name suggests, points to the object’s class which maintains a dispatch table. This dispatch table essentially contains pointers to the methods the class implements, among other data.
When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class. As a result the value of the isa pointer does not necessarily reflect the actual class of the instance.
You should never rely on the isa pointer to determine class membership. Instead, you should use the class method to determine the class of an object instance.
Реализация KVO опирается на мощные динамические возможности среды выполнения.
То есть, когда для наблюдения добавляется объект типа ObjectA, система сгенерирует класс NSKVONotifying_ObjectA и укажет указатель isa объекта на новый класс, что означает, что тип объекта изменился. По сравнению с ObjectA, этот класс перепишет следующие методы.
Переписать сеттер
В установщике будут добавлены следующие два вызова методов.
Затем в didChangeValueForKey: В, чтобы позвонить:
Содержит уведомления о новых и старых значениях.
Так реализовано уведомление об изменении значения атрибута. Поскольку принцип KVO заключается в изменении метода установки, установщик должен быть вызван для использования KVO. Нет никакого эффекта, если вы напрямую обращаетесь к объекту атрибута.
Переписать класс
При изменении точки isa возвращаемое значение class не изменится, но значение isa изменится.
Результат печати: 2018-05-06 22: 47: 05.538899 + 0800 KVCKVO [38474: 13343992] ObjectA 2018-05-06 22:47 : 05.539242 + 0800 KVCKVO [38474: 13343992] NSKVONotifying_ObjectA
Переписать dealloc
Система переопределяет метод освобождения ресурсов для освобождения ресурсов.
Перепишите _isKVOA
Этот частный метод используется, чтобы указать, что класс является классом, заявленным механизмом KVO.
Как доказать, что наблюдаемый класс переопределен
СправкаИспользуйте код, чтобы изучить принцип реализации KVC / KVOЭта статья, посредством пошагового анализа кода и снимков экранов точек останова, вполне может доказать описанный выше переписанный метод.
Подписывайтесь на меня
Добро пожаловать, чтобы обратить внимание на публичный аккаунт: jackyshan, первый WeChat технических галантерейных товаров, первый толчок.