2011-01-07 19 views
0

ich ziemlich neu bin in Objective-C, und es wäre wirklich hilfreich, wenn mir jemand mit der folgenden Aufgabe helfen könnte:Vorbei an Methoden - Objective-C

ich eine Klasse Der Controller haben, das ein Verfahren doTask hat . Das Ziel von DoTask besteht darin, eine MasterUtility (auch eine benutzerdefinierte Klasse) zu erreichen und Daten abzurufen und sie dann zu senden, wenn sie fertig ist (sie verwendet einen Thread). Insbesondere möchte ich, dass es an dataReceiver in ReportsViewController sendet. Ich denke, ich muss @selector oder etwas ähnliches verwenden. Hier ist ein Code:

@implementation ReportsViewController 

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

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

@end 

Hier ist 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 

Kann mir jemand in den Bereichen füllen, die "WAS GEHT HIER" geben? Vielen Dank!!



Antwort

2

Sie könnten einen Block verwenden:

typedef void (^Callback)(NSArray*); 

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

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

Das ist sehr flexibel, aber vielleicht zu komplex. Wenn Sie etwas einfachere möchten, können Sie immer nur passieren den Wähler und Ziel, so wie man dachte:

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

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

Oder Sie ein Protokoll verwenden können:

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

Diese Lösung ist ein bisschen heawyweight, aber Der Vorteil ist, dass der Compiler einige Fehler für Sie abfängt. Es gibt auch mehr Kopplung, aber es ist bei weitem kein Problem.

0

Vielleicht möchten Sie noch einmal überlegen, wie Sie dieses Problem angehen.

Anstatt zu versuchen, Ihre MasterUtilities Instanz die Daten an Ihre andere Methode zu senden, warum nicht Ihre getData Methode die Daten von der Methode zurückgeben und dann Ihre ReportsViewController die Daten an dataReceiver übergeben:?

+1

Er sagt, dass er einen Thread verwendet, so dass er wahrscheinlich eine asynchrone Schnittstelle benötigt. – zoul

+0

Guter Punkt, verpasste das bisschen. – Jasarien

Verwandte Themen