2013-03-03 9 views
23

Ho 2 metodi da eseguire su un evento click del pulsante dire method1: e method2:. Hanno chiamate di rete e quindi non si può essere sicuri di quale terminerà per primo.Come scrivere il metodo da eseguire dopo il completamento di due metodi (ios)

devo eseguire un altro metodo methodFinish dopo il completamento sia Method1: e method2:

-(void)doSomething 
{ 

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

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

Come posso realizzare questo diverso da quello tipico start method1:-> completed -> start method2: ->completed-> start methodFinish

Leggi su blocks..I sono molto nuovo a blocchi.Cancuno mi aiuta con la scrittura di uno per questo? E qualsiasi spiegazione sarà molto utile.Grazie

+2

Questo è ciò che i blocchi sono per. –

risposta

51

Questo è ciò che è dispatch groups.

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

I gruppi di invio sono gestiti da ARC. Vengono mantenuti dal sistema fino a quando tutti i blocchi non vengono eseguiti, quindi la gestione della memoria è semplice sotto ARC.

Vedere anche dispatch_group_wait() se si desidera bloccare l'esecuzione fino al termine del gruppo.

+1

Grazie, un dubbio. I miei metodi contengono l'implementazione di blocchi al suo interno (Post di Restkit e metodi get). Saranno influenzati in qualche modo? –

+1

Questo non è un problema. I blocchi possono essere eseguiti all'interno di altri blocchi e le code possono inviare liberamente elementi che girano su altre (o le stesse) code. I dettagli di implementazione interna non dovrebbero avere alcun impatto su di te qui. –

-6

Si potrebbe semplicemente usare un flag (aka una variabile BOOL) che ti consente di sapere in entrambi i metodi (A o B) se l'altro uno ha completato ancora. Qualcosa di simile:

- (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 
} 

Cheers!

+4

Sto cercando di evitare loop e bool –

+3

cosa succede se hai 1000 metodi? :) –

+0

questo è un paradigma di codifica pazzo: - | – Mehdi

0

Neat metodo poco che ho ricevuto da quadro Googles iOS si affidano piuttosto pesantemente:

- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel { 


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

} 
+0

Come chiamare il metodo da un altro? 'RunSigninThenInvokeSelector: (SEL) signInDoneSel'? –

Problemi correlati