2015-11-26 5 views
0

В моем проекте я планирую использовать NSNotificationCenter для связи класса с классом. Поэтому я собираюсь добавить много наблюдателей в NSNotificationCenter. Мне интересно, безопасно ли это? или, другими словами, это хорошая практика? На самом деле, я сейчас реорганизую свой код, и я хочу разобраться в методах, которые не должны выполняться внутри класса. На самом деле, у меня много контроллеров предупреждений внутри UIViewController, и это действительно беспокоит меня каждый раз, когда я отлаживаю. Теперь я просто достал все эти контрольные контроллеры и завернул их в другой класс. Для блока обратного вызова в UIAlertAction я отправляю уведомление на адрес UIViewController. Вот почему я добавляю много наблюдателей. Мы ценим любые предложения. Большое спасибо!Добавление многопользовательских наблюдателей для NSNotificationCenter

+0

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

ответ

1

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

По конкретному вопросу использования уведомлений для передачи информации о UIAlertActions не делайте этого. Нет ничего плохого в том, что у вас есть класс, который скрывает шаблон для создания определенных экземпляров UIAlertViewController с определенными действиями. Однако API для такого класса должен иметь фабричные методы для каждого конкретного предупреждения, и эти методы должны принимать блоки как параметры для представления обработчиков действий. Органы блоков будут определены в UIViewController, который вызывает предупреждение.

Пример

@interface CustomAlertsFactory : NSObject 

+ (void)presentDeleteConfirmationAlertFromViewController:(UIViewController *)viewController 
             withConfirmAction:(void (^)(UIAlertAction *action))confirmHandler 
              cancelAction:(void (^)(UIAlertAction *action))cancelHandler; 

@end 

Реализация этого метода создаст UIAlertViewController с учетом как подтверждения удаления. Действия подтверждения и отмены будут настроены на использование блоков, переданных в качестве параметров.

На стороне контроллера просмотра представьте, что вы разрешаете редактировать таблицу. В tableView:commitEditingStyle:forRowAtIndexPath: вы бы бросить предупреждение следующим образом:

[CustomAlertsFactory 
presentDeleteConfirmationAlertFromViewController:self 
withConfirmationAction:^(UIAlertAction *a) { 
    [tableView deleteRowsAtIndexPaths:@[indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 

    [self dismissViewControllerAnimated:YES completion:NULL]; 
} 
cancelAction:^(UIAlertAction *a) { 
    [self dismissViewControllerAnimated:YES completion:NULL]; 
} 
]; 
+0

Благодарим вас за ответ. :) Прежде чем делать то, что я делаю прямо сейчас, я также попробовал то, что вы предложили. Но можете ли вы дать мне только одну причину, по которой вы думаете, что бросить уведомления в этом случае нецелесообразно? –

+0

Это избыточно. У вас будет только один наблюдатель для каждого отображаемого вами оповещения. Он отделяет отображение предупреждения от кода, который обрабатывает действия. Он допускает ошибки, потому что наблюдатели должны отменить регистрацию, чтобы избежать утечек памяти. Это оставляет вас открытым для странного поведения/ошибок, если какой-то предыдущий наблюдатель никогда не регистрируется. – Avi

+0

Понял. Большое спасибо! –

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