Передача по методам - ​​Objective-C - PullRequest
0 голосов
/ 07 января 2011

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

У меня есть класс TheController, у которого есть метод DoTask.Цель DoTask состоит в том, чтобы обратиться к MasterUtility (также заказному классу) и получить данные, а затем отправить их обратно, когда это будет сделано (он использует поток).В частности, я хочу отправить его dataReceiver в ReportsViewController.Я думаю, что мне нужно использовать @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

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



Ответы [ 3 ]

2 голосов
/ 07 января 2011

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

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];
}

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

1 голос
/ 07 января 2011

Вы должны использовать шаблон проектирования Target-Action , который широко используется в какао.

Удачи!

0 голосов
/ 07 января 2011

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

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

...