簡體   English   中英

在Objective-C中實現委托模式

[英]Implementing Delegate Pattern in Objective-C

我正在構建一個處理NSURLConnection請求的類。 為了允許其他類使用這個類,我想允許主類在觸發connectionDidFinishLoading時調用委托。

我查看了很多文檔,但是我找不到任何可以提供任何明確示例的內容,而且我所擁有的代碼由於某種原因沒有調用委托。 我到目前為止的代碼是(代碼不相關刪除):

接口:

@interface PDUrlHandler : NSObject {
id delegate;
}
- (void)searchForItemNamed:(NSString *)searchQuery;
@property (nonatomic, assign) id delegate;
@end
@interface NSObject (PDUrlHandlerDelegate) 
- (void)urlHandler:(PDUrlhandler*)urlHandler searchResultsFinishedLoading:(NSDictionary *)resultData;
@end

執行:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"Fininshed Loading...");
    resultData = [self parseJSON:jsonData];

    if(delegate && [delegate respondsToSelector:@selector(urlHandler:searchResultsFinishedLoading:)]) {
        NSLog(@"Delegating!");
        [delegate urlHandler:self searchResultsFinishedLoading:resultData];
    } else {
        NSLog(@"Not Delegating. I dont know why.");
    }   

}

其他類中的代表:

- (void)urlHandler:(PDUrlhandler*)urlHandler searchResultsFinishedLoading:(NSDictionary *)resultData;
{
    NSLog(@"Delegating!!!!");
}

我的第一個想法是你可能沒有設置代表,但你有。 除此之外,代碼看起來正確。 看不出有什么不對。 您是否嘗試在檢查代理是否響應選擇器的位置放置斷點? 可能是委托值沒有保留並變為零。 確保您的委托不是零並且具有正確的對象。

您還確定連接是異步的嗎? 同步連接不會調用connectionDidFinishLoading方法

結果我忘了設置代表:

[currentHandler setDelegate:self];

需要跟蹤對PDUrlHandler進行初始調用的行。

對於有興趣看到這樣一個例子的人來說,蘋果樣本應用程序NSURLCache在NSURLCacheConnection.m中的NSURLConnection周圍實現了一個簡單的委托。

該示例應用程序可通過Apple開發人員連接獲得: http//developer.apple.com/iphone/library/samplecode/URLCache/index.html

我發現它很有用。

你正走在正確的軌道上,你實現委托模式的方式看起來還不錯。 它沒有被調用的原因是因為你在respondsToSelector中使用了錯誤的方法簽名; 你有humidorServer:searchResultsFinishedLoading:當你真正想要urlHandler:searchResultsFinishedLoading: .

它可能是委托中方法名稱末尾的半冒號(最右邊的底部代碼示例)嗎? 如果設置了委托並且正在調用-connectionDidFinishLoading:方法,那么我看不出任何錯誤

由於您使用“iphone”標記了這一點,我假設您正在使用iPhone應用程序,並且不需要支持10.5之前的OS X. 在Objective-C 2.0中,Apple建議您使用正式協議(使用@protocol)和可選方法而不是非正式協議。 這是相關文字:

作為非正式的,在類別中聲明的協議不會得到太多的語言支持。 在編譯時沒有類型檢查,也沒有在運行時檢查以查看對象是否符合協議。 要獲得這些好處,您必須使用正式的協議。 當所有方法都是可選的時,非正式協議可能很有用,例如對於委托,但是(在Mac OS X v10.5及更高版本中)通常最好使用帶有可選方法的正式協議。

來源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM