Использование селекторов для обратных вызовов? - PullRequest
0 голосов
/ 02 июля 2010

Я думаю, что я должен использовать селекторы (или даже другую парадигму), но даже после R'ing TFM я не могу понять, что я должен делать. Все это связано с обратными вызовами от делегата

У меня есть мой основной объект Model:

    @implementation Model
    @synthesize myConnection; // which is an NSURLConnection
    ...
    -(void)someMethod{
    MyConnectionDelegate *mcd = [[MyConnectionDelegate alloc]initWithCallingObject:self];
    myConnection = [[NSURLConnection alloc] initWithRequest:requestForToken delegate:mcd];
...
}
-(void)didGetCalledBack:(NSArray *)resultArray{
  NSLog(@"got the callback");
}

и затем в моем делегате:

@implementation MyConnectionDelegate
@synthesize callingObject; // which is of type id
@synthesize resultArray; // NSArray
-(id)initWithCallingObject:(id)caller{
  ...//std [self init] block
  self.callingObject  = caller;
  return self;
...
}


-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
...
}
//and all the other NSURLConnection delegate methods


- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
  ...
  // finish building array of results into self.resultArray
  [self.callingObject didGetCalledBack:self.resultArray];
}

Итак ... 1) Я думаю, что я должен использовать селекторы, или что-то еще, а не жестко кодировать тот факт, что вызывающая сторона (делегатор?) Должна реализовать - didGetCalledBack: Правильно? Если так, как? (и почему, кроме чистоты)

2) Или вся моя реализация неверна в том смысле, что я пытаюсь использовать обратный вызов от делегата NSURLConnection обратно делегату неправильно?

Я посмотрел образец кода Apple и т. Д., Но ничего из того, что я видел, не имеет ничего, кроме delegate:self. Возможно, я должен иметь делегат: self тоже для NSURLConnection, но я делаю много соединений, и если я делаю делегирование: self, мои методы делегата (например, - didReceiveData :) превращаются в большой беспорядок кода типа if (connection ==connection1){.

спасибо, ричард

Ответы [ 2 ]

2 голосов
/ 02 июля 2010

Я думаю, что я должен использовать селекторы или что-то еще, а не жестко кодировать тот факт, что вызывающая сторона (делегатор?) Должна реализовать -didGetCalledBack: Верно? Если так, как? (и почему, кроме чистоты)

Ничего плохого в том, что ты делаешь. Вы можете рассмотреть возможность объявления протокола для вызывающего объекта, например

@protocol CallingObject <NSObject>
    -(void) didGetCallBack: (NSArray*) resultArray;
@end

А потом

@interface Model : NSObject <CallingObject> // ...

и

@interface MyConnectionDelegate : NSObject
{
    // ...
}

-(id) initWithCallingObject: (id<CallingObject>) calller;

// ...

@end

Это даст вам некоторую проверку времени компиляции, что вызывающий объект реализует требуемый метод (ы).

1 голос
/ 02 июля 2010

Может быть, я должен иметь делегата: self тоже для NSURLConnection, но я делаю много соединений, и если я делаю delegate:self, мои методы делегата (например, -didReceiveData:) превращаются в большой беспорядок if (connection ==connection1){ введите код.

Тогда не используйте явные сравнения - используйте контейнеры или аналогичные абстракции для реагирования на разные соединения.

Например, чтобы использовать результаты соединений с различными элементами управления, используйтесловарь, который сопоставляется с NSURLConnection s с этими элементами управления, поэтому следующее:

if      (connection == connection1) [obj1 doStuff];
else if (connection == connection2) [obj2 doStuff];
// ...

становится:

[[connectionClients objectForKey:connection] doStuff];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...