Рабочий пример преимущества использования делегата в отличие от использования прямого отношения.
Скажите, что вы пишете универсальное приложение. У вас есть два контроллера вида в вашем коде iPadViewController
и iPhoneViewController
, и им необходимо получить данные из веб-службы. Таким образом, вы создаете класс для своего веб-сервиса, который вызывается webServiceDownloaderClass
.
Теперь, когда закончились webServiceDownloaderClass
, оба ваших контроллера просмотра должны быть уведомлены.
Ваши варианты здесь ...
Вариант 1 сильной связи
В вас iPadViewController
вы определяете метод - (void)webServiceDidGetArray:(NSArray *)array;
. И в iPhoneViewController
вы определяете тот же метод.
Для того, чтобы webServiceDownloaderClass
называть эти методы теперь необходима ссылка на каждый из контроллеров ...
@property (nonatomic, strong) IPadViewController *iPadController;
@property (nonatomic, strong) IPhoneViewController *iPhoneController;
, а затем, когда он закончит это необходимо, чтобы определить, какой из них назвать ...
if (iPadController) {
[iPadController webServiceDidGetArray];
}
etc....
Недостатки здесь в том, что контроллеры представления являются определением того, что делает класс веб-службы, когда он завершен. Кроме того, если вы добавляете еще один контроллер, у вас есть другое свойство и нет фактической гарантии того, что на контроллере, на который вы ссылаетесь, действительно есть метод, который вы пытаетесь вызвать.
Вариант 2 Делегация
В своем классе услуги, которые мы вам определить протокол.
@protocol WebServiceDownloaderDelegate <NSObject>
- (void)webServiceDidGetArray:(NSArray *)array
@end
и делегат ...
@property (nonatomic, weak) id <WebServiceDownloaderDelegate> delegate;
Теперь вы определяете действия класса веб-службы в классе веб-службы. И вам нужна только одна ссылка на любой класс, который хочет быть делегатом. Кроме того, любой класс может быть делегатом. Итак, теперь как iPad, так и iPhone-контроллер может быть делегатом, и, согласовав протокол, они «обещают» класс веб-сервисов, что они реализуют требуемый метод - (void)webServiceDidGetArray:(NSArray *)array;
.
Конечно, это только один случай, когда делегаты могут быть полезны.
Есть также случаи, когда вы должны использовать прямые отношения, а не делегирование.
Это способствует ослаблению связи –
Это то же самое, если вы никогда не меняете своего делегата, все равно, если ваш делегат может быть более чем одним. – zneak
Что вы подразумеваете под «сообщать что-то родительскому классу»? Если вы находитесь в производном классе, то сам производный класс является версией родительского класса. Хотя если вы хотите сообщить что-то родительскому классу, используйте [super methodName:]. – CodenameLambda1