在这里展示我与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;
}
答案 0 :(得分:2)
第二种方法是委托或回调方法。当您的连接实例从您连接的服务器收到响应时,将调用回调方法。 NSURLConnection在NSObject上有一些非正式的协议。这意味着当NSObject的任何子类实现这些方法时,将自动调用这些协议中定义的方法。您的NSObject子类已实现其中一个回调方法,因此调用此方法。大多数代表都被声明为正式协议,需要在类中明确定义才能使用它们。 NSURLConnection的非正式协议是规则的例外,虽然这将在iOS的未来版本中发生变化。
P.S。:Objective-C中的协议与Java / C#中的接口基本相同。
我猜你想在收到错误回复时取消连接?你应该做的是以下几点:
-connection:didReceiveResponse
委托方法中,如果响应状态代码不合适,请取消连接。您可以将ivar或财产用于此目的。答案 1 :(得分:2)
它是由NSURLConnection对象调用的,因此您无法干预调用它的代码。但是您不应该 - 委托方法的目的是使您能够连接到无法访问的代码。
方法签名是这样的,顺便说一下:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
它没有返回值,您无法更改方法签名,因为它是NSURLConnection对象协议的一部分。请记住,连接对象不会调用此方法。但您可以回复该方法。您可以在此方法中处理“if file ..”代码,或者从中调用另一个方法,而不是尝试返回BOOL。您应该记住,当确认响应已被启动时会触发(异步) - 因此您可以检查HTTP标头信息,例如mime类型 - 但它不保证完成数据传输(有{{3 }})。