一个使用委托而不是使用直接关系的优势的工作示例。
假设您正在编写一个通用应用程序。您的代码中有两个视图控制器,iPadViewController
它们iPhoneViewController
都需要从 Web 服务中获取数据。因此,您为 Web 服务调用创建了一个类webServiceDownloaderClass
。
现在,您的两个视图控制器都需要在webServiceDownloaderClass
完成时得到通知。
您在这里的选择...
方案一强耦合
在你身上iPadViewController
你定义了一个方法- (void)webServiceDidGetArray:(NSArray *)array;
。并在iPhoneViewController
您定义相同的方法。
为了webServiceDownloaderClass
调用这些方法,它现在需要对每个控制器的引用......
@property (nonatomic, strong) IPadViewController *iPadController;
@property (nonatomic, strong) IPhoneViewController *iPhoneController;
然后当它完成时,它需要确定调用哪一个......
if (iPadController) {
[iPadController webServiceDidGetArray];
}
etc....
这里的缺点是视图控制器在某种程度上定义了 Web 服务类在完成时所做的事情。此外,如果您添加另一个控制器,您将拥有另一个属性,并且不能真正保证您引用的控制器实际上具有您尝试调用的方法。
选项 2 委派
在您的我们服务类中,您定义了一个协议。
@protocol WebServiceDownloaderDelegate <NSObject>
- (void)webServiceDidGetArray:(NSArray *)array
@end
和一个代表...
@property (nonatomic, weak) id <WebServiceDownloaderDelegate> delegate;
现在,您正在 Web 服务类中定义 Web 服务类的操作。而且您只需要对任何想要成为代表的类的引用。此外,任何类都可以是委托。因此,现在 iPad 和 iPhone 控制器都可以成为委托,并且通过符合协议,他们“承诺”他们将实现所需方法的 Web 服务类- (void)webServiceDidGetArray:(NSArray *)array;
。
当然,这只是委托有用的一种情况。
在某些情况下,您可能应该使用直接关系而不是委托。