2013-11-29 6 views
0

Я работаю над приложением iOS. Я создал класс, который извлекает данные с сервера. Однако, когда запрос получает данные, мне нужно вызвать метод внутри контроллера представления, который создал экземпляр класса.Функция вызова из NSObject

Request.m

- (id)initWithDictionary:(NSMutableDictionary *)dict 
{ 
    if (self = [super init]) { 
     [[API sharedInstance] commandWithParams:dict onCompletion:^(NSDictionary *json) { 
            for (NSString* key in json) { 
             //call method in view controller 
           }]; 
    } 
    return self; 
} 

В некоторых вид контроллера:

//how I submit the request 
Request *myRequest = [[Request alloc] initWithDictionary:myDict]; 

//the method I need to call onCompletion: 
- (void)receivedRequest{} 

Если кто-то может дать мне на месте о том, как сделать это, я бы очень признателен!

ответ

3

Это приложение учебника для дизайна делегата шаблона:

Настройки протокола. Назовем это requestProtocol.

Определите методы, которые потребует объект запроса для вызова в протоколе запроса.

Дайте классу Request объект-делегат. Настройте делегата, чтобы он соответствовал вашему запросуProtocol.

Когда ваш контроллер представления создает объект запроса, настройте его как делегат.

(Это означает, что контроллер представления должен будет соответствовать вашему requestProtocol)

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

+0

Отлично, я хотел бы реализовать это. У вас есть ссылка на пример того, как это сделать? – user906357

+0

Быстрый поиск google в строке «object c delegate pattern example» показал эту ссылку, среди прочего: http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates/ –

1

Другим подходом к делегированию является использование блочного API, который более удобен в зависимости от сценария.

- (id)initWithDictionary:(NSMutableDictionary *)dict requestCompletionHandler:(void(^)(NSString*, id))completionHandler 
{ 
    if (self = [super init]) { 
     [[API sharedInstance] commandWithParams:dict onCompletion:^(NSDictionary *json) { 
            if(completionHandler == nil) return; 
            for (NSString* key in json) { 
             completionHandler(key, json[key]); 
           }]; 
    } 
    return self; 
} 

Но я бы рекомендовал внедрить несколько иной подход. Вы не должны выполнять свой запрос в своих методах init, а скорее после вызова метода start.

+0

Как вызвать метод запуска? Является ли это методом для NSObject, аналогичным методу viewDidLoad для ViewController? – user906357

+0

'viewDidLoad' - это метод, определенный в' UIViewController', а не 'NSObject'. Аналогичным образом, гипотетический метод 'start' был бы методом' Request', а не 'NSObject'. Создав объект 'Request', установив делегат или обработчик завершения, вы должны вызвать' [request start]; 'для выполнения запроса. –

+0

Понял, большое спасибо – user906357

Смежные вопросы