Метод класса Objective C не вызывает методы делегата, в то время как метод экземпляра делает

У меня есть следующие 2 метода:

-(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 никогда не вызывается!!

Может кто-нибудь объяснить мне это поведение? Спасибо!

4 ответа

Решение

Когда вы начинаете NSURLConnection с delegate:self, который устанавливает объект делегата, который получит connection:didReceiveResponse: сообщение. Если вы используете self в методе класса этот метод также будет вызываться как метод класса.

Если вы измените authenticateUserToGoogle метод, чтобы быть методом класса, просто изменив "-" в "+" в сигнатуре метода, затем измените connection:didReceiveResponse: метод делегата "-" в "+" тоже. Итак, ваш код выглядит так:

+ (void)authenticateUserToGoogle:(NSString *)userName withPassword:(NSString *)password {

    // Your code here
}

+ (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

    // Your code here
}

Вы устанавливаете делегата на себя в своем методе. Если это метод класса, self не содержит экземпляр класса. Я предполагаю, что это либо сам класс, либо ноль.

Попробуйте изменить оба метода класса.

Если вы также не измените метод делегата на метод класса, он не будет вызываться, поскольку делегат (класс) не отвечает на сообщение, а только его экземпляры.

Другие вопросы по тегам