NSNotification против делегатов протоколов? - PullRequest
6 голосов
/ 12 марта 2010

У меня есть приложение для iPhone, которое в основном получает информацию из API (в XML, но, возможно, в конечном итоге JSON). Объекты результата обычно отображаются в контроллерах представления (в основном, в таблицах).

Вот архитектура прямо сейчас.

У меня есть классы NSOperation, которые выбирают различные объекты с удаленного сервера. Каждый из этих классов NSOperation будет принимать собственный метод делегата, который будет запускать результирующие объекты при их разборе, а затем, наконец, метод, когда больше нет результатов. Итак, протокол для делегатов будет выглядеть примерно так:

(void) ObjectTypeResult:(ObjectType *)result;
(void) ObjectTypeNoMoreResults;

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

Итак, я думаю об использовании NSNotifications для удаления использования делегатов. Я мог бы включить объект в часть userInfo уведомления и просто опубликовать объекты как полученные, а затем заключительное событие, когда больше не будет доступно. Тогда у меня мог бы быть только один метод в каждом контроллере представления для получения всех данных, даже при использовании нескольких объектов в одном контроллере. †

Итак, кто-то может поделиться со мной некоторыми плюсами / минусами каждого подхода. Должен ли я рассмотреть возможность рефакторинга своего кода для использования событий, а не делегатов? Является ли одно лучше другого в определенных ситуациях? В моем сценарии я действительно не хочу получать уведомления в нескольких местах, так что, возможно, именно на этом основаны делегаты на основе протокола.

Спасибо!

1 Ответ

5 голосов
/ 13 марта 2010

На самом деле, ваш дизайн звучит хорошо. Чистый подход Какао использует делегатов, и гораздо предпочтительнее, чем разбрасывать объекты. Кроме того, определение ваших протоколов таким образом делает ваш код очень четким и легким для понимания. В общем, продолжайте в том же духе

...