我有以下两种方法:
-(void)authenticateUserToGoogle:(NSString *)userName withPassword:(NSString *)password {
NSString *URLstr = GOOGLE_CLIENT_LOGIN;
URLstr = @"http://www.google.com/ig/api?stock=AAPL";
NSURL *theURL = [NSURL URLWithString:URLstr];
NSURLRequest *theRequest = [NSURLRequest requestWithURL:theURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:100.0];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (!theConnection) {
NSLog(@"COuldn't register device information with Parking Server");
} else {
NSLog(@"Got a connection!!");
NSMutableData *_responseData = [NSMutableData data];
NSLog(@"respone_data = %@",_responseData);
}
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
NSInteger statusCode = [HTTPResponse statusCode];
if (404 == statusCode || 500 == statusCode) {
//[self.controller setTitle:@"Error Getting Parking Spot ....."];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:FALSE];
NSLog(@"GOT A 'FUCKED' STATUS CODE");
[connection cancel];
NSLog(@"Server Error - %@", [NSHTTPURLResponse localizedStringForStatusCode:statusCode]);
} else if (200 == statusCode) {
NSLog(@"GOT A 'OK' RESPONSE CODE");
}
}
如果我将authenticateUserToGoogle方法称为这样的实例方法:
[self authenticateUserToGoogle:user withPassword:password]
我得到以下输出:
2011-08-12 00:14:08.490 stcoks[81272:f203] Got a connection!!
2011-08-12 00:14:08.492 stcoks[81272:f203] respone_data = <>
2011-08-12 00:14:08.726 stcoks[81272:f203] GOT A 'OK' RESPONSE CODE
但是,如果我将authenticateUserToGoogle方法更改为类方法,只需将方法签名中的“ - ”更改为“+”,然后将其调用为:
[MasterViewController authenticateUserToGoogle:user withPassword:password]
我得到以下输出:
2011-08-12 00:14:08.490 stcoks[81272:f203] Got a connection!!
2011-08-12 00:14:08.492 stcoks[81272:f203] respone_data = <>
换句话说,它似乎与类方法一样,委托方法连接didReceiveResponse永远不会被调用!!
任何人都可以向我解释这种行为吗?谢谢!
答案 0 :(得分:5)
使用delegate:self
启动NSURLConnection时,会设置将接收connection:didReceiveResponse:
消息的委托对象。如果在类方法中使用self
,则此方法也将作为类方法调用。
答案 1 :(得分:2)
您在方法中将委托设置为self。如果它是类方法,则self不包含类的实例。我猜它可能是班级本身,也可能是零。
尝试将两者都更改为类方法。
答案 2 :(得分:2)
如果您将authenticateUserToGoogle
方法更改为类方法,只需将方法签名中的"-"
更改为"+"
,然后更改connection:didReceiveResponse:
委托方法{{ 1}}到"-"
。所以你的代码看起来像,
"+"
答案 3 :(得分:1)
除非您还将委托方法更改为类方法,否则不会调用它,因为委托(类)不响应消息 - 只有它的实例才会响应。