Реализация шаблона делегата в Objective-C - PullRequest
4 голосов
/ 18 января 2009

Я создаю класс, который обрабатывает запросы NSURLConnection. Чтобы другие классы могли использовать этот класс, я бы хотел, чтобы основной класс вызывал делегат при срабатывании connectionDidFinishLoading.

Я просмотрел много документации, но не могу найти ничего, что дает какие-либо четкие примеры, и код, который у меня есть, по какой-то причине не вызывает делегата. Код, который у меня пока есть (код не имеет значения удален):

Интерфейс:

@interface PDUrlHandler : NSObject {
id delegate;
}
- (void)searchForItemNamed:(NSString *)searchQuery;
@property (nonatomic, assign) id delegate;
@end
@interface NSObject (PDUrlHandlerDelegate) 
- (void)urlHandler:(PDUrlhandler*)urlHandler searchResultsFinishedLoading:(NSDictionary *)resultData;
@end

Реализация:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"Fininshed Loading...");
    resultData = [self parseJSON:jsonData];

    if(delegate && [delegate respondsToSelector:@selector(urlHandler:searchResultsFinishedLoading:)]) {
        NSLog(@"Delegating!");
        [delegate urlHandler:self searchResultsFinishedLoading:resultData];
    } else {
        NSLog(@"Not Delegating. I dont know why.");
    }   

}

Представитель другого класса:

- (void)urlHandler:(PDUrlhandler*)urlHandler searchResultsFinishedLoading:(NSDictionary *)resultData;
{
    NSLog(@"Delegating!!!!");
}

Ответы [ 6 ]

4 голосов
/ 19 января 2009

Моей первой мыслью было, что вы могли не назначить делегата, но у вас есть. Кроме этого, код выглядит правильно. Не вижу ничего плохого. Вы пытались установить точку останова в том месте, где вы проверяете, отвечает ли ваш делегат на селектор? Возможно, значение делегата не было сохранено и стало равным нулю. Убедитесь, что ваш делегат не ноль и имеет правильный объект.

Также вы уверены, что соединение асинхронное? Синхронные соединения не будут вызывать метод connectionDidFinishLoading

3 голосов
/ 21 марта 2009

Для тех, кому интересно посмотреть пример этого примера приложения Apple, NSURLCache реализует простой делегат вокруг NSURLConnection в NSURLCacheConnection.m

Образец приложения доступен через соединение Apple для разработчиков здесь: http://developer.apple.com/iphone/library/samplecode/URLCache/index.html

Я нашел это довольно полезным.

3 голосов
/ 19 января 2009

Оказывается, я забыл установить делегата:

[currentHandler setDelegate:self];

нужно идти после строки, которая делает первоначальный вызов PDUrlHandler.

1 голос
/ 18 января 2009

Вы на правильном пути, способ реализации шаблона делегата выглядит хорошо. Причина, по которой он не вызывается, заключается в том, что вы используете неверную сигнатуру метода в RespondsToSelector; у вас есть humidorServer:searchResultsFinishedLoading:, когда вы действительно хотите urlHandler:searchResultsFinishedLoading:.

0 голосов
/ 22 января 2009

Поскольку вы пометили это как «iphone», я предполагаю, что вы работаете над приложением для iPhone и не должны поддерживать OS X до 10.5 В Objective-C 2.0 Apple предлагает использовать формальные протоколы (используя @protocol) с дополнительными методами вместо неофициальных протоколов. Вот соответствующий текст:

Будучи неофициальным, протоколы объявлены в категории не получают много языка служба поддержки. Там нет проверки типа в время компиляции или проверка во время выполнения, чтобы посмотреть, соответствует ли объект протокол. Чтобы получить эти преимущества, вы должен использовать официальный протокол. неофициальный протокол может быть полезен, когда все методы необязательны, такие как для делегата, но (в Mac OS X v10.5 и позже) обычно лучше использовать формальный протокол с дополнительным методы.

( источник )

0 голосов
/ 19 января 2009

Может ли это быть точка с запятой в конце имени метода в делегате (нижний пример кода в крайнем правом углу)? Если делегат установлен и вызывается -connectionDidFinishLoading: метод, я не вижу ничего плохого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...