我有一个静态库,目前正在使用 NSNotificationCenter 发送响应。但我觉得代表会是一个更好的解决方案。问题是当我还不知道它们的标头时如何调用委托方法。我不确定在使用库时如何实现不取决于我的东西。
那么允许用户创建自己的方法并在需要时调用它们的库有什么好处吗?
我有一个静态库,目前正在使用 NSNotificationCenter 发送响应。但我觉得代表会是一个更好的解决方案。问题是当我还不知道它们的标头时如何调用委托方法。我不确定在使用库时如何实现不取决于我的东西。
那么允许用户创建自己的方法并在需要时调用它们的库有什么好处吗?
委托通常通过您声明指定回调集的协议来进行通信。
@protocol MONImageGeneratorObserver <NSObject>
@required
// called when an image has been generated
- (void)generatedImageWasSavedToURL:(NSURL *)pURL;
- (void)imageGenerationDidComplete;
@end
然后,您可以通过在 API 中指定协议来告诉客户他们必须实现的接口:
- (void)setImageGeneratorObserver:(NSObject<MONImageGeneratorObserver>*)pObserver;
另一种实现此目的的好方法是提供一个块参数。当您收到该块时,您通常会想要复制它。那么你就不需要知道任何关于客户端的代码了。
您的 API 应该非常具体:
@interface MONObject : NSObject
+ (void)performAsynchronousLoadWithSuccessfulCallback:(void(^)(void))pSuccess errorCallback:(void(^)(NSError *))pError;
@end
@implementation MONObject
+ (void)performAsynchronousLoadWithSuccessfulCallback:(void(^)(void))pSuccess errorCallback:(void(^)(NSError *))pError
{
if (random()%2) {
// load succeeded!
pSuccess();
}
else {
// load failed = =
NSError * e = ...;
pError(e);
}
}
@end
在这两种情况下,您都指定了接口,并且不需要在您的实现中查看它们的标头。他们可以在块体或回调定义中调用自己的方法MONImageGeneratorObserver
。