Im Wesentlichen habe ich eine Reihe von Daten in einem NSDictionary
, aber aus Bequemlichkeit richte ich einige NSArray
s mit den Daten sortiert und gefiltert auf ein paar verschiedene Arten. Die Daten werden über verschiedene Threads (Blöcke) eingehen, und ich möchte sicherstellen, dass immer nur ein Block meinen Datenspeicher ändert.@synchronisierter Block versus GCD dispatch_async()
Ich machte mir heute Nachmittag die Mühe, eine Versandwarteschlange einzurichten und stolperte dann zufällig auf einen Post über @synchronized
, der es so aussehen ließ, als würde ich genau das tun, was ich machen wollte.
Also, was ich jetzt habe, ist ...
// 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...
});
}
Und meine Frage ist, kann ich nur all dies mit folgendem ersetzen?
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
@synchronized (self) {
// do stuff...
};
}
... Und was ist der Unterschied zwischen den beiden? Was sollte ich beachten?
'@ synchronized' ist wirklich langsam. Ich kann die Messwerte, die ich gerade suche, nicht finden, aber überprüfe auch https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html. – Richard
Wenn Ihre Daten über dieselbe Dispatch-Warteschlange (gleicher Thread) eingehen, stoßen sie nicht zusammen. Wenn Sie verschiedene Warteschlangen (verschiedene Threads) verwenden, wäre eine Synchronisierung notwendig. – Jeremy
Es gefunden (via http://stackoverflow.com/q/10094361/480850): http://perpendiculo.us/?p=133 – Richard