W mojej aplikacji mam funkcję, która tworzy NSRURLSession i wysyła NSURLRequest za pomocą
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
W bloku ukończenia tego zadania muszę wykonać obliczenia, które dodają obraz UIImagającego do wywołującego kontrolera widoku. Mam func o nazwie
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
wykonuje obliczenia dodające UIImage. Jeśli spróbuję uruchomić kod dodający widok wewnątrz bloku uzupełniania, Xcode zgłasza błąd informujący, że nie mogę używać silnika układu podczas pracy w tle. Znalazłem więc kod na SO, który próbuje ustawić w kolejce metodę w głównym wątku:
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))
dispatch_after(time, dispatch_get_main_queue(), {
let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})
Nie wiem jednak, jak dodać parametry „receiveAddr” i „ountBTC ”do tego wywołania funkcji. Jak mam to zrobić lub czy ktoś może zasugerować optymalny sposób dodania wywołania metody do głównej kolejki aplikacji?
Wersja Swift 3+ i Swift 4:
Swift 3 i Xcode 9.2:
źródło
Swift 2
Przy zamykaniu końcowym staje się to:
Zamknięcia końcowe to szybki cukier syntaktyczny, który umożliwia zdefiniowanie zamknięcia poza zakresem parametru funkcji. Aby uzyskać więcej informacji, zobacz Trailing Closures in Swift 2.2 Programming Language Guide.
W dispatch_async przypadku API
func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
, ponieważdispatch_block_t
jest typu alias dla() -> Void
- zamknięcie, które otrzymuje 0 parametrów i nie mają wartość powrotną, i blok jest ostatnim parametrów funkcji można określić zamykający w zewnętrznym zakresudispatch_async
.źródło
Odśwież kolekcję Zobacz w głównym wątku
źródło
Oto ładniejsza (IMO) składnia w stylu Swifty / Cocoa, aby osiągnąć ten sam wynik, co inne odpowiedzi:
Lub możesz pobrać popularną bibliotekę Async Swift, aby uzyskać jeszcze mniej kodu i więcej funkcji:
źródło
OperationQueue.main.addOperation({ }
Właściwym sposobem na to jest użycie dispatch_async w main_queue, tak jak zrobiłem w poniższym kodzie
źródło
Oto miła, globalna funkcja, którą możesz dodać, aby uzyskać ładniejszą składnię:
I wykorzystanie
źródło
źródło
Nie zapomnij osłabić siebie, jeśli używasz siebie wewnątrz zamknięcia.
źródło