2014-10-19 11 views
8

Mam następujący kod:Zastanawianie się składnię Grand Central Dispatch w 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 

    } 
} 

Jednak to nie skompilować. Wewnętrzna wywołanie dispatch_async zwraca następujący błąd kompilacji:

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

I nie wydają się rysunek się, jak napisać to tak, że działa jak kiedyś, aby móc w Celu C. Dzięki za wszelkie pomysły!

+4

nie mogę powiedzieć o zupełnie pewności nie wiedząc, co się wewnątrz zamknięcia, ale prawdopodobnie używasz opcji [Implicit Returns from 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). Spróbuj umieścić wyraźne 'return' na końcu twojego wewnętrznego zamknięcia. –

+0

Mike S, wydaje się, że zadziałało. Dzięki! Jeśli umieścisz to jako odpowiedź, mogę oznaczyć je jako poprawne. – Sparklellama

Odpowiedz

17

Zamknięcia w Swift mogą mieć ukryte zwrotów jeśli zawierają tylko jeden wyraz (patrz: Implicit Returns from Single-Expression Closures). Twoje wewnętrzne zamknięcie najprawdopodobniej ma jedno wyrażenie, aby zaktualizować interfejs użytkownika. Kompilator używa wyniku tego wyrażenia jako wartości zwracanej dla zamknięcia, co powoduje, że podpis zamknięcia nie odpowiada wymaganiom podpisu. Od dispatch_async chce zamknięcie zwracającą () (lub Void), poprawka jest po prostu dodać wyraźnie return na końcu zamknięcia:

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

Zawartość wewnętrznego zamknięcia to: self.targetSprite? .texture = SKTexture (image: self.mainImage); ... więc ta odpowiedź jest trafna. – Sparklellama

0

możliwość zagubienia w nawiasach zamknięcia i szelki:

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

Nie, ponieważ zamknięcie jest ostatnim parametrem, może to być końcowe zamknięcie. To nie jest problem. – Lance

+0

Używam powyższego kodu i działa dobrze. – zisoft

+2

tak, nie powiedziałem, że nie będzie. To, co mówię, to też jego kod działa dobrze. – Lance

Powiązane problemy