Делегаты часто сообщаются посредством объявления протокола, который определяет набор обратных вызовов.
@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
В обоих случаях вас укажите интерфейс и не должны видеть свои заголовки в вашем представлении ntation. Они могут вызывать свои собственные методы в блоке или в своих определениях обратных вызовов MONImageGeneratorObserver
.
Да, шаблон делегирования подходит именно для этого. –