Запрос делегатов в Objective - C - PullRequest
0 голосов
/ 24 февраля 2011

Итак, у меня есть хорошее представление о том, что делает делегат, зачем его использовать, как его реализовать и т. Д., И я работаю над его внедрением в одном из моих проектов. Проблема, которую я пытаюсь решить, состоит в том, чтобы отделить мои объекты Controller от моего класса доступа к сети. В этом контексте идеи немного запутались в моей голове.

Мне почему-то интуитивно кажется, что NetworkAccessClass должен быть делегатом для объекта Controller, потому что NetworkAccessClass действует как помощник для объекта Controller. Но похоже, что это работает в обратном порядке, потому что следующее, по-видимому, правильный способ сделать это:

NetworkaccessClass.h

@protocol NetworkAccessDelegate
-(void) requestSucceded:(NSData *) data
-(void) requestFailed:(int) responseCode;
@end
@interface NetworkAccessClass : NSObject
{
    id<NetworkAccessDelegate> networkDelegate;
}

@property(nonatomic, assign) id networkDelegate;

-(void) initWithDelegate:(id) delegate; //

@end

NetworkAccessClass.m

@implementation
@synthesize networkDelegate

-(void) initWithParams:(id) delegate
{
    networkDelegate = delegate;
    // Assign GET/POST vals, create request etc
    [request startAsynchronous];    
}

-(void) requestSucceded:(ASIHTTPRequest *) request
{
    if([networkDelegate respondsToSelector:@selector(requestSucceded:)]) {
        // Send the data to the controller object for it to use
        ...
    }
}

-(void) requestFailed:(ASIHTTPRequest *) request
{
    // Same as above. Send to request failed.
}

@end 

И наконец по моему FirstViewController.h

#import "NetworkAccessClass.h"
@interface FirstViewController<NetworkAccessDelegate>
{

}
-(void) requestSucceded:(NSData *) data;
-(void) requestFailed:(int) responseCode;
@end

И то же самое в SecondViewController.h и т. Д.

Хотя это отсоединяет мои контроллеры от моего класса Network, я не могу не чувствовать, что это неправильно , потому что контроллеры в этом случае действуют как делегаты или вспомогательные методы to Network Класс, а не наоборот. Я что-то упустил? Или это так?

Спасибо,
Тея.

1 Ответ

4 голосов
/ 24 февраля 2011

Делегаты не являются "вспомогательными методами". Думайте о них как об объектах, которые получают уведомление, когда что-то происходит. (Хотя не путайте их с «Уведомлениями» - это совсем другое дело.) В этом случае ваш сетевой класс выполняет свою работу и затем вызывает свой метод делегата в View Controller, который создает и запускает его, чтобы сообщить содержимое этого ответа на контроллер представления. Затем контроллер, предположительно, обновит представление данными, полученными сетевым соединителем. Классическая модель делегата, прямо там.

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