2016-06-07 19 views
1

Mindestens seit iOS 9 ist NSPrivateQueueConcurrencyType der einzige nicht veraltete Thread-Concurrency-Typ für Core Data-Vorgänge, die nicht im Hauptthread ausgeführt werden. Mein Problem ist jetzt, dass ich die Thread-Priorität für das, wie dies ändern will:Festlegen der CoreData NSManagedObjectContext-Threadpriorität

...:(int) neededPriority { 
    _queue = dispatch_queue_create("Worker", DISPATCH_QUEUE_SERIAL); 
    dispatch_set_target_queue(_queue, 
    dispatch_get_global_queue(neededPriority, 0)); 

Manchmal brauche ich eine hohe Priorität, manchmal gering. Aber wenn ich [_privateContext performBlock:...] rufe, kann ich keinen Parameter mit der benötigten Priorität übergeben, noch hat der Kontext irgendeine Eigenschaft, um seine Thread-Priorität festzulegen.
Daher meine Frage: Gibt es eine Möglichkeit, die Kontextwarteschlange in eine bestimmte Thread-Priorität zu setzen?

Antwort

0

NSManagedObjectContext Instanzen werden Warteschlangen zugewiesen, keine Threads. Die mit der performBlock-Routine verknüpfte Warteschlange kann als beliebiger Hintergrundthread ausgeführt werden, sodass Sie einem Kontext keine allgemeine Priorität zuweisen können.

Stattdessen können Sie innerhalb des performBlock-Blocks NSThread.setThreadPriority aufrufen, um die Priorität des Threads zu ändern, der diesen Block verarbeitet.

Sie können die Priorität des Threads speichern, bevor Sie ihn ändern, und ihn am Ende des Blocks zurücksetzen.

+1

Wenn Sie 'performBlockAndWait:' während des Hauptthreads verwenden, führt die Warteschlange den Block im Hauptthread aus. Also würden alle 'NSThread'-Aufrufe auf den Hauptthread angewendet werden. –

+0

Danke, ein kurzer Test mit 'NSLog (@" Alte Thread-Priorität:% f ", [NSThread threadPriority]); if (! [NSThread setThreadPriority: 0.1]) { NSLog (@ "Konnte die Priorität nicht setzen!"); } else { NSLog (@ "Neue Threadpriorität:% f", [NSThread threadPriority]); } zeigte, dass es zu funktionieren scheint. – Jan