Meine Frage ist, ob der Datenbankschreibvorgang im Hauptthread oder in einem Hintergrundthread erfolgt.
Wenn Sie eine NSOperationQueue
von Grund auf neu erstellen wie in:
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
Es wird in einem Hintergrund-Thread sein:
Operationswarteschlangen stellen normalerweise die Threads bereit, die zum Ausführen ihrer Operationen verwendet werden. In OS X 10.6 und höher verwenden Operationswarteschlangen die libdispatch-Bibliothek (auch als Grand Central Dispatch bezeichnet), um die Ausführung ihrer Operationen zu initiieren. Infolgedessen werden Operationen immer in einem separaten Thread ausgeführt , unabhängig davon, ob sie als gleichzeitige oder nicht gleichzeitige Operationen bezeichnet werden
Es sei denn, Sie verwenden mainQueue
:
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
Sie können auch Code wie diesen sehen:
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
[myQueue addOperationWithBlock:^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
}];
}];
Und die GCD-Version:
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
{
dispatch_async(dispatch_get_main_queue(), ^(void)
{
});
});
NSOperationQueue
gibt feinere Kontrolle mit dem, was Sie tun möchten. Sie können Abhängigkeiten zwischen den beiden Vorgängen erstellen (herunterladen und in der Datenbank speichern). Um die Daten zwischen einem Block und dem anderen zu übertragen, können Sie beispielsweise davon ausgehen, dass a NSData
vom Server kommt, also:
__block NSData *dataFromServer = nil;
NSBlockOperation *downloadOperation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakDownloadOperation = downloadOperation;
[weakDownloadOperation addExecutionBlock:^{
dataFromServer = ....
}];
NSBlockOperation *saveToDataBaseOperation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakSaveToDataBaseOperation = saveToDataBaseOperation;
[weakSaveToDataBaseOperation addExecutionBlock:^{
}];
[saveToDataBaseOperation addDependency:downloadOperation];
[myQueue addOperation:saveToDataBaseOperation];
[myQueue addOperation:downloadOperation];
Bearbeiten: Warum ich eine __weak
Referenz für die Operationen verwende, finden Sie hier . Kurz gesagt, es ist jedoch zu vermeiden, Haltezyklen beizubehalten.