2014-10-19 3 views
8

Ich habe den folgenden Code:Herauszufinden Syntax für Grand Central Dispatch in Swift

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

    // Do stuff in the backgroud 

    dispatch_async(dispatch_get_main_queue()) { 

     // Do stuff on the UI thread 

    } 
} 

jedoch nicht kompilieren. Der innere Aufruf dispatch_async gibt den folgenden Compiler-Fehler:

Cannot invoke 'init' with an argument list of type '(dispatch_queue_t!,() ->() -> $T3)' 

Ich kann nicht scheinen, um herauszufinden, wie dies zu schreiben, so dass es funktioniert, wie ich verwenden, um für alle Ideen in Objective C. Dank der Lage sein!

+4

Ich kann nicht mit völlig sicher sagen, ohne zu wissen, was in Ihrer Schließung ist, aber wahrscheinlich rennst du zu [Implizite Rückgabe von Single-Expression Closures] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/ UID/TP40014097-CH11-XID_157). Versuchen Sie, am Ende Ihres inneren Abschlusses eine explizite "Rückkehr" zu setzen. –

+0

Mike S, das scheint zu funktionieren. Vielen Dank! Wenn Sie dies als Antwort veröffentlichen, kann ich es als korrekt markieren. – Sparklellama

Antwort

17

Closures in Swift kann implizite Rendite haben, wenn sie nur einen einzigen Ausdruck enthalten (siehe: Implicit Returns from Single-Expression Closures). Ihre innere Schließung hat höchstwahrscheinlich einen einzelnen Ausdruck, um die Benutzeroberfläche zu aktualisieren. Der Compiler verwendet das Ergebnis dieses Ausdrucks als Rückgabewert für den Abschluss, wodurch die Signatur des Abschlusses nicht mit der Signatur dispatch_async übereinstimmen kann. Da dispatch_async eine Schließung will die () (oder Void) gibt, das Update eine explizites return am Ende des Verschlusses nur hinzufügen, ist:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

    // Do stuff in the backgroud 

    dispatch_async(dispatch_get_main_queue()) { 

     // Do stuff on the UI thread 

     return 
    } 
} 
+0

Inhalt der inneren Schließung sind: self.targetSprite? .texture = SKTexture (Bild: self.mainImage); ... also ist diese Antwort genau richtig. – Sparklellama

0

Sie verlegt die Schließung geklam- mert und die Klammern:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
    // Do stuff in the background 

    dispatch_async(dispatch_get_main_queue(), { 
     // Do stuff on the UI thread 
    }) 
}) 
+3

Nein, da der Abschluss der letzte Parameter ist, kann es sich um einen abschließenden Abschluss handeln. Das ist nicht das Problem. – Lance

+0

Ich benutze den obigen Code und es funktioniert gut. – zisoft

+2

ja, ich habe nicht gesagt, dass es nicht wäre. Was ich sage, ist sein Code funktioniert auch gut. – Lance

Verwandte Themen