Essenzialmente, ho un set di dati in un NSDictionary
, ma per comodità sto impostando alcuni NSArray
s con i dati ordinati e filtrati in diversi modi. I dati arriveranno attraverso diversi thread (blocchi) e voglio assicurarmi che ci sia un solo blocco alla volta che modifica il mio data store.blocco @synchronized GCD dispatch_async()
Ho passato la briga di creare una coda di spedizione questo pomeriggio, e poi casualmente sono incappato in un post su @synchronized
che mi ha fatto sembrare esattamente quello che voglio fare esattamente.
Quindi ciò che ho in questo momento è ...
// a property on my object
@property (assign) dispatch_queue_t matchSortingQueue;
// in my object init
_sortingQueue = dispatch_queue_create("com.asdf.matchSortingQueue", NULL);
// then later...
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
dispatch_async(_sortingQueue, ^{
// do stuff...
});
}
E la mia domanda è, posso solo sostituire tutto questo con il seguente?
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
@synchronized (self) {
// do stuff...
};
}
... E qual è la differenza tra i due comunque? Cosa dovrei considerare?
'@ synchronized' è molto lento. Non riesco a trovare le metriche che sto cercando in questo momento, ma anche controllare https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html. – Richard
Se i dati arrivano tramite la stessa coda di invio (stesso thread), non si scontreranno. Se userete code diverse (thread differenti), allora sarebbe necessaria una sincronizzazione. – Jeremy
Trovato (via http://stackoverflow.com/q/10094361/480850): http://perpendiculo.us/?p=133 – Richard