Как я должен общаться асинхронно между моделями и контроллерами в цели c? - PullRequest
1 голос
/ 16 мая 2011

У меня есть класс Authenticator, в котором есть метод аутентификации с помощью ключа API и другой метод аутентификации с помощью адреса электронной почты и пароля. Аутентификация выполняется с помощью асинхронного HTTP-запроса.

У меня есть LoginController, который управляет представлением, в которое пользователь введет свой адрес электронной почты / пароль.

Вот фрагмент кода:

// LoginController

- (void)awakeFromNib {
   self.authenticator = [[Authenticator alloc] init];
}

- (IBAction)authenticateWithEmailAndPassword: (id)sender {
    // Async HTTP request, so we can't just check the return 
    // value to see if authentication was successful or not
    [self.authenticator authenticateWithEmail:[emailField stringValue]
                                     password:[passwordField stringValue]];
}

Мой Authenticator объект выполняет аутентификацию, а моему LoginController нужен асинхронный результат (успех или неудача).

Как Objective C может передавать асинхронно от модели обратно к контроллеру?

Ответы [ 2 ]

3 голосов
/ 16 мая 2011

Один из возможных шаблонов, который вы могли бы использовать, это делегат.

Вы можете определить AuthenticatorDelegate протокол и ваш LoginController соответствует ему. Что-то вроде:

@protocol AuthenticatorDelegate
- (void) authenticationSuccessful;
- (void) authenticationFailedWithError:(NSError *)error
@end

@interface Authenticator : NSObject
{
    ...
    id <AuthenticatorDelegate> delegate;
}
@property (assign) id <AuthenticatorDelegate> delegate;

@end

ваш LoginController будет объявлен как

@interface LoginController : UIViewController <AuthenticatorDelegate>
...

и при его инициализации вы устанавливаете делегата

- (void)awakeFromNib {
    self.authenticator = [[Authenticator alloc] init];
    self.authenticator.delegate = self;
}

и затем, когда ваши Authenticator объекты получат результат, вы просто вызываете соответствующий метод для делегата.

Конечно, это только одна из возможностей. Другие подходы могут использовать кодовые блоки или пару целевой / селектор.

1 голос
/ 16 мая 2011

сделайте аутентификатор делегатом вашего NSURLConnection, затем переопределите

connectionDidFinishLoading:

и

connection:didFailWithError:

сохраните ссылку в LoginController в аутентификаторе, затем, когда вы получите connectionDidFinishLoading:, вы оцените ответ и отправите сообщение обратно LoginController.

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