2011-01-07 3 views
0

Я довольно новыми для Objective-C, и было бы очень полезно, если бы кто-то может помочь мне со следующей задачей:Проходя по методам - ​​Objective-C

У меня есть класс, который имеет TheController метод Выполнитезадачи , Цель DoTask - обратиться к MasterUtility (также пользовательскому классу) и получить данные, а затем отправить его обратно, когда это будет сделано (он использует поток). В частности, я хочу, чтобы он отправил его в dataReceiver в ReportViewController. Я думаю, мне нужно использовать @selector или что-то в этом роде. Вот код:

@implementation ReportsViewController 

-(void)doTask { 
    MasterUtilities *mu = [[MasterUtilities alloc] init]; 
    [mu getDataAndSendTo:[WHAT GOES HERE]] 
} 

-(void)dataReceiver:(NSArray *)data { 
    NSLog(@"data: %@",data); 
} 

@end 

Вот MasterUtilities

@implementation MasterUtilities 

    - (void)getDataAndSendTo:[WHAT GOES HERE] { 
     NSArray *data = [[NSArray init] alloc]; 
     ....getting data here.... 

     [WHAT GOES HERE? HOW DO I CALL THE METHOD (dataReceiver) IN ReportsViewController?] 
    } 

    @end 

Можно ли заполнить в тех областях, которые указывают на «ЧТО ЗДЕСЬ»? Спасибо!!



ответ

2

Вы можете использовать блок:

typedef void (^Callback)(NSArray*); 

[somebody doSomethingAndPerform:^(NSArray *data) { 
    // do whatever you want with the data 
}]; 

- (void) doSomethingAndPerform: (Callback) callback 
{ 
    NSArray *data = …; 
    callback(data); 
} 

Это очень гибкий, но может быть слишком сложным. Если вы хотите что-то проще, вы всегда можете просто передать селектор и цель, так же, как вы думали:

[somebody doSomethingAndCall:@selector(dataReceiver:) on:self]; 

- (void) doSomethingAndCall: (SEL) selector on: (id) target 
{ 
    NSArray *data = …; 
    [target performSelector:selector withObject:data]; 
} 

Или вы можете использовать протокол:

@protocol DataConsumer 
- (void) handleData: (NSArray*) data; 
@end 

// this class has to implement DataConsumer 
[somebody doSomethingAndNotify:self]; 

- (void) doSomethingAndNotify: (id <DataConsumer>) consumer 
{ 
    NSArray *data = …; 
    [consumer handleData:data]; 
} 

Это решение является немного heawyweight, но преимущество заключается в том, что компилятор улавливает некоторые ошибки для вас. Там также больше сцепления, но это далеко не проблема.

0

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

Вместо того, чтобы пытаться получить MasterUtilities экземпляр для отправки данных на другой метод, почему бы не ваш метод getData возвращать данные из метода, а затем ваш ReportsViewController передать данные dataReciever?

+1

Он говорит, что использует поток, так что ему, вероятно, нужен асинхронный интерфейс. – zoul

+0

Хороший момент, пропустил этот бит. – Jasarien

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