вторник, 11 августа 2015 г.

10. Нотификации

Видео урок находится по этому адресу.
В этом уроке рассматривается такой механизм как нотификации.
Так же в уроке применяется шаблон программирования одиночка (единый центр нотификаций)  и шаблон наблюдатель (observer).

Так же показана работа с глобальными переменными используемыми для нотификаций.
Синтаксис глобальных строковых переменных:
в h. файле:
extern NSString * const TAGovernmentTaXLevelDidChangeNotification;
extern NSString * const TAGovernmentTaXLevelUserInfoKey; //применяется для ключа в словаре dictionary

в m. файле инкапсулировано(скрыто) инициализация констант значениями:
NSString * const  TAGovernmentTaXLevelDidChangeNotification = @"TAGovernmentTaXLevelDidChangeNotification";

NSString * const TAGovernmentTaXLevelUserInfoKey=@"TAGovernmentTaXLevelUserInfoKey";

Для передачи переменных вместе с нотификацией создается словарь, где под нужным ключом (TAGovernmentTaXLevelUserInfoKey) сохраняется переменная (taxLevel в данном случае)

   NSDictionary * dictionary=[NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:taxLevel] forKey:TAGovernmentTaXLevelUserInfoKey];



далее  получаем указатель на единый центр нотификаций и отправляем ему нотификацию, сообщаем название события TAGovernmentSalaryDidChangeNotification и передаем словарь с записанной переменной по нашему ключу:


    [[NSNotificationCenter defaultCenter] postNotificationName:TAGovernmentSalaryDidChangeNotification object:nil userInfo:dictionary];

для того, чтобы подписаться на нотификацию TAGovernmentSalaryDidChangeNotification   (добавить наблюдателя) :
      NSNotificationCenter *ns=[NSNotificationCenter defaultCenter];
        [ns  addObserver:self selector:@selector(salaryChangeNotification:) name:TAGovernmentSalaryDidChangeNotification object:nil];

Функция вызываемая при получении нотификации:

 -(void) salaryChangeNotification: (NSNotification*) notification{}


 Сразу же при подписке на нотификацию делаем удаления наблюдателя (или отдельной нотификации) например в деструкторе:
-(void) dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
 
}

  (или отдельной нотификации)

//    [[NSNotificationCenter defaultCenter] removeObserver:self name:TAGovernmentTaXLevelDidChangeNotification object:nil];



 Для того, чтобы вытащить из словаря пришедшего с нотификацией нашу переменную:

    NSNumber * value=[notification.userInfo objectForKey:TAGovernmentSalaryUserInfoKey];
 
    CGFloat salary=[value floatValue];


Исходный текст проекта по уроку №10 Нотификации.

Домашнее задание к уроку 10.
Задание:

Ученик.

1. Используя мой код создать свой проект со своими классами и понять как оно работает
2. Добавить классы "пенсионер" и "бизнесмен"
3. Доктор следит за изменением зарплаты, бизнесмен должен следить за изменением налогов, а пенсионер за изменением пенсий.
4. Все классы: Доктор, Пенсионер и Бизнесмен долджны следить также и за средней ценой на товар.

Умничка.

5. Каждый из классов следит за инфляцией (процентный рост средней цены на товар) и оценивает свой потенциальный доход по отношению к инфляции, например размер пенсии к возможности купить продукты у пенсионера, либо новая прибыль за вычетом налогов у бизнесмена также по отношению к ценам на товар.

6. Не секрет что изменение этих характеристик оказывает разное влияние на разные слои населения, поэтому пусть в зависимости от уровня покупательской способности каждый класс выдает свои перлы.

Мастер.

7. Подпишите классы на нотификацию ухода приложения в бекграунд, чтобы когда нажимается кнопка HOME и приложение сворачивается, каждый объект заявлял о том что он идет спать

8. Тоже самое сделать для случая, когда приложение возвращается из свернутого состояния

Супермен

9. Создайте свой класс аналог апп делегату, только он не делегат приложения, но слушатель тех же самых нотификаций, какие методы есть у делегата. Грубо говоря у вашего класса должны быть теже методы, что и у апп делегата, но вызываться они должны путем нотификаций

10. Добавьте НСЛоги в каждый метод апп делегата и своего класса

11. Сворачивая и разварачивая приложение добивайтесь вызовов определенный методов делегата и тех же нотификаций и посмотрите что вызывается раньше - метод делегата или нотификация :)


Выполнил задания Ученик и Мастер.
Проект с домашним заданием

Комментариев нет:

Отправить комментарий