2013-07-15 44 views
1

我有一個靜態庫,當前使用NSNotificationCenter發送響應。但我覺得代表會是更好的解決方案。問題是如何在我不知道它們的頭文件時調用委託方法。我不知道如何實現這個庫在使用時不能滿足我的要求。靜態庫回調

那麼有沒有好的方法允許用戶創建自己的方法,並在需要時調用它們?

+0

是的,委託模式完全適用於此。 – 2013-07-15 12:18:07

回答

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。他們可以在塊體或回調的定義中調用他們自己的方法。

+0

我認爲這些街區能夠很好地適應我現在擁有的東西。你可以存儲一個塊的字典在稍後調用一個? – walsh06

+0

@ walsh06是的,你可以。再次,你應該複製這些塊,只要你稍後使用它們(真正的簡化)。 ios和osx上的塊實現爲objc對象;您可以保留並釋放它們,並將它們用作'NSDictionary'實例中的值。通常情況下,一個複雜的回調接口將使用協議實現 - 字典是不尋常的。如果客戶的每個回調狀態非常複雜,則可以將塊用作函數對象,這可以爲您的客戶提供很大的靈活性。 – justin

+0

好的,感謝您的幫助 – walsh06