Objective C不确定调用方法的位置?

时间:2013-02-05 12:55:59

标签: objective-c nsurlconnection

在这里展示我与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;
}

2 个答案:

答案 0 :(得分:2)

第二种方法是委托或回调方法。当您的连接实例从您连接的服务器收到响应时,将调用回调方法。 NSURLConnection在NSObject上有一些非正式的协议。这意味着当NSObject的任何子类实现这些方法时,将自动调用这些协议中定义的方法。您的NSObject子类已实现其中一个回调方法,因此调用此方法。大多数代表都被声明为正式协议,需要在类中明确定义才能使用它们。 NSURLConnection的非正式协议是规则的例外,虽然这将在iOS的未来版本中发生变化。

P.S。: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或财产用于此目的。

答案 1 :(得分:2)

它是由NSURLConnection对象调用的,因此您无法干预调用它的代码。但是您不应该 - 委托方法的目的是使您能够连接到无法访问的代码。

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

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

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

另请参阅other delegate methods for that