2013-07-15 4 views
1

У меня есть статическая библиотека, которая в настоящее время отправляет ответы, используя NSNotificationCenter. Но я чувствую, что делегаты будут лучшим решением. Проблема в том, как я могу назвать методы делегата, когда еще не знаю их заголовков. Я не уверен, как реализовать материал, который не зависит от меня, когда библиотека используется.Обратный вызов статической библиотеки

Итак, есть ли смысл разрешить пользователю создавать свои собственные методы и библиотеку, вызывающую их, когда они необходимы?

+0

Да, шаблон делегирования подходит именно для этого. –

ответ

0

Делегаты часто сообщаются посредством объявления протокола, который определяет набор обратных вызовов.

@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.

+0

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

+0

@ walsh06 да, вы можете. опять же, вы должны скопировать эти блоки, когда вы будете использовать их «позже» (действительно упрощенно). блоки на ios и osx реализованы как объекты objc; вы можете сохранить и освободить их, а также использовать их как значения в экземплярах NSDictionary. как правило, сложный интерфейс обратного вызова будет реализован с использованием протокола - словарь необычен. если состояние вашего клиента для обратного вызова является сложным, тогда блоки могут использоваться как объекты функций, что может обеспечить большую гибкость для ваших клиентов. – justin

+0

ok, спасибо за помощь – walsh06