2012-01-10 9 views

risposta

14

Sì, è possibile. Ci sono alcuni strumenti di sincronizzazione disponibili:

  • @synchronized
  • NSLock
  • NSCondition
  • NSConditionLock
  • semafori
  • GCD
  • serrature pthread
  • ...

Suggerirei di leggere "Threading Programming Guide" e di chiedere qualcosa di più specifico.

+0

e OSSpinLock. – Jano

+0

@synchonized è il mio preferito. Usalo con un oggetto globale come un NSNumber statico se non ci sono oggetti ovvi su cui bloccare. Attaccare a un modello di semaforo probabilmente faciliterà la leggibilità, ecc. –

+0

La sincronizzazione su un oggetto globale è una cattiva idea. Non sai se anche altri codici potrebbero essere sincronizzati su di esso in modo da esporsi al rischio di deadlock. Sincronizza sempre su qualcosa con visibilità limitata che è esplicitamente per l'attività in corso. Inoltre, non sincronizzarsi mai su se stessi; ancora, non sai cos'altro potrebbe usare lo stesso oggetto. – occulus

4

non sono riuscito a trovare un oggetto nativo IOS per fare questo, ma funziona bene utilizzando la libreria C:

#import "dispatch/semaphore.h" 
... 
dispatch_semaphore_t activity; 
... 
activity = dispatch_semaphore_create(0); 
... 
dispatch_semaphore_signal(activity); 
... 
dispatch_semaphore_wait(activity, DISPATCH_TIME_FOREVER); 

Speranza che aiuta.

6

Ti piace questa:

dispatch_semaphore_t sem = dispatch_semaphore_create(0); 

[self methodWithABlock:^(id result){ 
    //put code here 
    dispatch_semaphore_signal(sem); 

    [self methodWithABlock:^(id result){ 
     //put code here 
     dispatch_semaphore_signal(sem); 
    }]; 
}]; 

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 

credito http://www.g8production.com/post/76942348764/wait-for-blocks-execution-using-a-dispatch

3

In Swift 3 è possibile utilizzare un DispatchSemaphore.

// initialization 
let semaphore = DispatchSemaphore(value: initialValue) 

// wait, decrement the semaphore count (if possible) or wait until count>0 
semaphore.wait() 

// release, increment the semaphore count 
semaphore.signal() 
Problemi correlati