Iphone 在Objective-C中实现委托模式

Iphone 在Objective-C中实现委托模式,iphone,objective-c,delegates,Iphone,Objective C,Delegates,我正在构建一个处理NSURLConnection请求的类。为了允许其他类使用这个类,我希望允许主类在触发ConnectiondFinishLoading时调用委托 我已经查阅了很多文档,但是我找不到任何清晰的示例,而且我的代码出于某种原因没有调用委托。到目前为止,我拥有的代码是(删除了不相关的代码): 接口: @interface PDUrlHandler : NSObject { id delegate; } - (void)searchForItemNamed:(NSString *)sea

我正在构建一个处理NSURLConnection请求的类。为了允许其他类使用这个类,我希望允许主类在触发ConnectiondFinishLoading时调用委托

我已经查阅了很多文档,但是我找不到任何清晰的示例,而且我的代码出于某种原因没有调用委托。到目前为止,我拥有的代码是(删除了不相关的代码):

接口:

@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!!!!");
}

您走在正确的轨道上,实现委托模式的方式看起来不错。没有调用它的原因是因为您在respondsToSelector中使用了错误的方法签名;当您实际需要
urlHandler:searchResultsFinishedLoading:
时,您有
HumidorsServer:searchResultsFinishedLoading:

代理中方法名称末尾的分号(最右边的底部代码示例)吗?如果设置了委托并且调用了-connectiondFinishLoading:方法,则我看不出有任何错误

结果是我忘记设置委托:

[currentHandler setDelegate:self];

需要按照对PDUrlHandler进行初始调用的行进行操作。

我的第一个想法是您可能没有设置委托,但您已经设置了。除此之外,代码看起来是正确的。看不出有什么不对劲。您是否尝试在检查代理是否响应选择器的位置放置断点?可能是委托值未保留,变为零。确保您的委托不是nil,并且具有正确的对象


另外,您确定连接是异步的吗?同步连接不会调用ConnectionIDFinishLoading方法

,因为您将其标记为“iphone”,我假设您正在使用iphone应用程序,不需要支持OS X 10.5之前的版本。在Objective-C2.0中,Apple建议您使用正式协议(使用@protocol)和可选方法,而不是非正式协议。以下是相关文本:

非正式的,非正式的 类别没有太多的语言 支持。现在没有类型检查 编译时或运行时检查 查看对象是否符合 协议要获得这些好处,您必须 必须使用正式的协议。一 非正式协议在以下情况下可能有用: 所有方法都是可选的,例如 对于代理,但(在Mac OS X v10.5上) 之后)通常最好 使用正式协议和可选协议 方法


()

对于任何有兴趣看到此示例的人,苹果示例应用程序NSURLCache在NSURLCacheConnection.m中围绕NSURLConnection实现了一个简单的委托

示例应用程序可通过以下apple developer连接获得:


我发现它非常有用。

在实现中的方法名称上留一个分号在Objective-C中是有效的。我喜欢习惯性地这样做,因为您可以在实现和接口之间复制和粘贴,而不用担心它。