0

在这里展示我对 Objective C 的了解程度。这两个方法中的第二个被上面的方法调用。虽然我完全不知道在哪里?我希望能够将调用第二种方法的部分包装在 if 语句中,以根据返回的布尔值确定文件是否存在。示例代码将不胜感激,如果有人也可以解释如何调用第二种方法,那也很棒。

-(void) queryResponseForURL:(NSURL *)inURL {
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:inURL];
    [request setHTTPMethod:@"HEAD"];
    NSURLConnection * connection = [NSURLConnection connectionWithRequest:request delegate:self];
    // connection starts automatically
}

-(BOOL)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    if([(NSHTTPURLResponse *)response statusCode] == 200){
        NSLog(@"file exists");
        return YES;
    }else return NO;
}
4

2 回答 2

2

它被 NSURLConnection 对象调用,所以你不能干预调用它的代码。但是您不应该这样做 - 委托方法的目的是让您能够连接到那些无法访问的代码。

顺便说一句,方法签名是这样的:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

它没有返回值,并且您不能更改方法签名,因为它是 NSURLConnection 对象协议的一部分。请记住,您不调用此方法,而是调用连接对象。但是您可以响应该方法。您可以在此方法中处理您的“if file..”代码,或从中调用另一个方法,而不是尝试返回 BOOL。您应该记住,这是在确认已启动响应时(异步)触发的 - 因此您可以检查 HTTP 标头信息,例如 mime 类型 - 但它不能保证完成数据传输(还有其他委托方法为此)。

另请参阅NSURLConnection 的开发人员指南

于 2013-02-05T13:47:35.870 回答
2

第二种方法是委托或回调方法。当您的连接实例收到来自您连接的服务器的响应时,将调用回调方法。NSURLConnection 有一些关于 NSObject 的非正式协议。这意味着当 NSObject 的任何子类实现了这些方法时,将自动调用这些协议中定义的方法。您的 NSObject 子类已实现这些回调方法之一,因此调用此方法。大多数委托被声明为正式协议,并且需要在您的类中显式定义才能使用它们。NSURLConnection 的非正式协议是规则的例外,尽管这将在未来的 iOS 版本中改变。

PS:Objective-C 中的协议本质上与 Java / C# 中的接口相同。

更多信息在这里:http: //developer.apple.com/library/ios/ipad/#documentation/Foundation/Reference/NSURLConnectionDataDelegate_protocol/Reference/Reference.html


我猜你想在收到错误回复时取消连接?你应该做的是:

  1. 将您的 URLConnection 存储在 ivar 或属性中(我个人更喜欢属性)。
  2. 在您的-connection:didReceiveResponse委托方法中,如果响应状态代码不是适当的值,请取消您的连接。您可以为此目的使用您的 ivar 或财产。
于 2013-02-05T13:07:25.590 回答