2016-05-05 15 views
0

Nichts in Kommandozeilen-Tool Xcode in der Konsole ausgibt, wenn ich den folgenden Code ausführen:Nichts druckt in der Konsole in Kommandozeilen-Tool Xcode

import Foundation 

class A { 
    var someValue = 0 

    let concurrentQueue = dispatch_queue_create("queue_for_property", DISPATCH_QUEUE_CONCURRENT) 

    func increaseValueBy1000() { 
    dispatch_barrier_async(concurrentQueue) { 
     for _ in 0 ..< 1000 { 
     let v = self.someValue + 1 
     print(v) 
     self.someValue = v 
     } 
    } 
    } 
} 

let instance1 = A() 

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) { 
    instance1.increaseValueBy1000() 
} 

instance1.increaseValueBy1000() 

Ich sehe keine print-Anweisung in der Konsole . Wenn ich Barrier Linie entfernen funktioniert ganz gut. Was mache ich falsch in diesem Fall, warum meine Barrieren nicht erlauben zu drucken?

Antwort

4

Anwendungen - wie zum Kommandozeilen-Programme hat - die bereits einen „run-Schleife“ nicht haben haben

dispatch_main() // Swift 2 
dispatchMain() // Swift 3 

fordern, um GCD zu verwenden. Aus der Dokumentation:

Diese Funktion „parkt“ der Haupt-Thread und wartet auf Blöcke an die Haupt Warteschlange gestellt werden. Anwendungen, die UIApplicationMain (iOS), NSApplicationMain (Mac OS X) oder CFRunLoopRun auf dem Haupt -Thread aufrufen, dürfen dispatch_main nicht aufrufen.

+0

Danke, kannst du erklären, in welchem ​​Teil ich es nennen sollte? –

+0

@ wm.p1us: Am Ende Ihres Programms. Siehe auch https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/dispatch_main.3.html. –

+0

Danke! Klappt wunderbar! Aber wenn ich die Barriere entferne, habe ich Doppelwerte, aber keine Race Condition. Weil Werte nicht neu geschrieben werden. –