Метод класса Objective C не вызывает методы делегата, в то время как метод экземпляра делает - PullRequest
3 голосов
/ 12 августа 2011

У меня есть следующие 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 ]

5 голосов
/ 12 августа 2011

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

2 голосов
/ 12 августа 2011

Если вы измените метод authenticateUserToGoogle на метод класса, просто изменив "-" на "+" в сигнатуре метода, то измените "-" метода делегата *1005* на "+"Итак, ваш код выглядит так:

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

    // Your code here
}

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

    // Your code here
}
2 голосов
/ 12 августа 2011

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

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

1 голос
/ 12 августа 2011

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

...