2010-04-23 13 views

Odpowiedz

4

Można mieć - [MojaKlasa startAsynchronousCode] wywołania zwrotnego:

typedef void(*DoneCallback)(void *); 

-(void) startAsynchronousCode { 
    // Lots of stuff 
    if (finishedCallback) { 
    finishedCallback(self); 
    } 
} 

a następnie instancji MojaKlasa takiego:

MyClass *myClass = [[MyClass alloc] initWith: myCallback]; 

mycallback może wyglądać następująco:

void myCallback(void *userInfo) { 
    MyClass *thing = (MyClass *)userInfo; 
    // Do stuff 
    [thing release]; 
} 
+1

Kiedy „mycallback” metoda zakończy przyzwyczajenie wykonanie zwrotu kod do końca metody, która nazywa się zwrotnego: „startAsynchronousCode "który właśnie został wydany? – Robert

+1

Tak, dlatego ważne jest, aby naprawdę wykonać polecenie przed wywołaniem wywołania zwrotnego. Nie otrzymasz żadnych naruszeń dostępu, chyba że odnosisz się do siebie po wywołaniu zwrotnym. –

+1

Myślę, że pytasz "Jak jest asynchroniczny startAsynchroniczny kod?" w twoim komentarzu? Powyższy idiom jest przeznaczony do tworzenia wątku i uruchamiania startAsynchronousCode z nowego wątku. –

0

Co zawsze robiłem jest utrzymywana zmienna instancji, która wskazuje na obiekt asynchroniczny.

- (id)init { 
    myClass = [[MyClass alloc] init]; 
    [myClass startAsynchronousCode]; 
} 

- (void)myClassDidFinish:(MyClass *)myClass { 
    [myClass release]; 
} 
1

Musisz zachować swój obiekt myClass wewnętrznie w metodzie startAsynchronousCode. I zwolnij go również wewnętrznie po jego zakończeniu.

To zachowanie używane w NSURLConnection, UIAlertView i innych obiektach asynchronicznych.

3

W jaki sposób wywołujesz asynchroniczny kod? Jeśli użyjesz NSThread +detachNewThreadSelector:toTarget:withObject:, zauważysz, że obiekt docelowy jest zatrzymywany przez wątek, dopóki nie zakończy się, a następnie zostanie zwolniony. Możesz zwolnić obiekt natychmiast po wiadomości asynchronicznej.

np.

@implementation MyClass 

-(void) startAsynchronousCode 
{ 
    [NSThread detachNewThreadSelector: @selector(threadMain:) toTarget: self withObject: nil]; 
} 

-(void) threadMain: (id) anObject 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    // do stuff 
    [pool drain]; 
} 
@end 

Z powyższego następujący kod jest całkowicie bezpieczne:

MyClass* myClass = [[MyClass alloc] init]; 
[myClass startAsynchronousCode]; 
[myClass release]; 
+0

To bardzo pomaga ... Dzięki. – jfalexvijay

Powiązane problemy