2013-03-03 1 views
23

Ich habe 2 Methoden auf eine Schaltfläche ausgeführt werden Click Event sagen method1: und method2:. Beide haben Netzwerkanrufe und so kann nicht sicher sein, welche zuerst beendet wird.Wie schreibe ich die Methode nach Abschluss der beiden Methoden (ios)

muss ich methodFinish beide nach Abschluss method1 andere Methode ausführen: und method2:

-(void)doSomething 
{ 

    [method1:a]; 
    [method2:b]; 

    //after both finish have to execute 
    [methodFinish] 
} 

Wie kann ich diese andere als die typische start method1:-> completed -> start method2: ->completed-> start methodFinish

Lesen Sie erreichen über blocks..I bin sehr neu auf blocks.Kann jemand mir helfen, einen für diese zu schreiben? Und jede Erklärung wird sehr hilfreich sein.Vielen Dank

+2

Dies ist, was Blöcke sind für. –

Antwort

51

Dies ist, was dispatch groups sind für.

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_group_t group = dispatch_group_create(); 

// Add a task to the group 
dispatch_group_async(group, queue, ^{ 
    [self method1:a]; 
}); 

// Add another task to the group 
dispatch_group_async(group, queue, ^{ 
    [self method2:a]; 
}); 

// Add a handler function for when the entire group completes 
// It's possible that this will happen immediately if the other methods have already finished 
dispatch_group_notify(group, queue, ^{ 
    [methodFinish] 
}); 

Versandgruppen werden ARC verwaltet. Sie werden vom System beibehalten, bis alle ihre Blöcke laufen, so dass ihre Speicherverwaltung unter ARC einfach ist.

Siehe auch dispatch_group_wait(), wenn die Ausführung bis zum Ende der Gruppe blockiert werden soll.

+1

Vielen Dank, ein Zweifel. Meine Methoden enthalten Block-Implementierung in ihm (Restkit Post und Methoden abrufen). Wird es von irgendwelchen Mitteln betroffen sein? –

+1

Das ist kein Problem. Blöcke können innerhalb anderer Blöcke ausgeführt werden, und Warteschlangen können Objekte, die auf anderen (oder denselben) Warteschlangen ausgeführt werden, frei verteilen. Die internen Implementierungsdetails sollten Sie hier überhaupt nicht beeinflussen. –

-6

Sie könnten einfach eine Fahne (aka eine BOOL-Variable) verwenden, die Sie in beiden Methoden (A oder B) wissen lässt wenn der andere einer ist noch fertig. Etwas in den folgenden Zeilen:

- (void) methodA 
{ 
    // implementation 

    if (self.didFinishFirstMethod) { 
     [self finalMethod]; 
    } else { 
     self.didFinishFirstMethod = YES; 
    } 
} 


- (void) methodB 
{ 
    // implementation 

    if (self.didFinishFirstMethod) { 
     [self finalMethod]; 
    } else { 
     self.didFinishFirstMethod = YES; 
    } 
} 


- (void) finalMethod 
{ 
    // implementation 
} 

Prost!

+4

Ich versuche, Schleifen und Bools zu vermeiden –

+3

was ist, wenn Sie 1000 Methoden haben? :) –

+0

das ist verrückt Codierungsparadigma: - | – Mehdi

0

Ordentlich wenig Methode, die ich von Googles iOS-Framework bekam sie auf ziemlich stark verlassen:

- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel { 


    if (signInDoneSel) { 
     [self performSelector:signInDoneSel]; 
    } 

} 
+0

Wie man die Methode von einem anderen anruft? 'runSigninThenInvokeSelector: (SEL) signInDoneSel'? –

Verwandte Themen