Протоколы NSNotification и делегировать?


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

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

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

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

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

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

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

Спасибо!

1 6

1 ответ:

На самом деле, ваш дизайн звучит хорошо. Подход clear Cocoa использует делегатов и гораздо предпочтительнее, чем разбрасывание предметов. Кроме того, определение протоколов таким образом делает ваш код очень ясным и легким для понимания. В целом: продолжайте хорошую работу