4

我正在构建一个处理 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!!!!");
}
4

6 回答 6

4

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

您还确定连接是异步的吗?同步连接不会调用connectionDidFinishLoading方法

于 2009-01-19T08:30:55.920 回答
3

原来我忘了设置委托:

[currentHandler setDelegate:self];

需要在对 PDUrlHandler 进行初始调用的行之后进行。

于 2009-01-18T22:12:02.863 回答
3

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

示例应用程序可通过此处的苹果开发人员连接获得:http: //developer.apple.com/iphone/library/samplecode/URLCache/index.html

我发现它非常有用。

于 2009-03-20T23:05:57.773 回答
1

你在正确的轨道上,你实现委托模式的方式看起来不错。它没有被调用的原因是你在 respondsToSelector 中使用了错误的方法签名;你有humidorServer:searchResultsFinishedLoading:你真正想要的时候urlHandler:searchResultsFinishedLoading:

于 2009-01-18T20:37:04.927 回答
0

可能是委托中方法名称末尾的分号(最右边的底部代码示例)?如果设置了委托并且正在调用 -connectionDidFinishLoading: 方法,那么我看不到任何错误

于 2009-01-18T21:46:12.213 回答
0

由于您使用“iphone”标记了它,我假设您正在开发 iPhone 应用程序并且不需要支持 OS X 10.5 之前的版本。在 Objective-C 2.0 中,Apple 建议您使用带有可选方法的正式协议(使用 @protocol)而不是非正式协议。以下是相关文字:

作为非正式的,在类别中声明的协议没有得到太多的语言支持。在编译时没有类型检查,也没有在运行时检查对象是否符合协议。要获得这些好处,您必须使用正式的协议。当所有方法都是可选的(例如对于委托)时,非正式协议可能很有用,但是(在 Mac OS X v10.5 及更高版本上)通常最好将正式协议与可选方法一起使用。

来源

于 2009-01-22T19:16:16.897 回答