Dans Swift comment appeler la méthode avec des paramètres de PGCD thread principal?
Dans mon application j'ai une fonction qui fait un NSRURLSession et envoie une NSURLRequest à l'aide de
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
Dans la réalisation de bloc pour cette tâche, j'ai besoin de faire de calcul, qui ajoute une UIImage à l'appel de la viewcontroller. J'ai un func appelé
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
qui ne le UIImage-ajout de calcul. Si j'essaie d'exécuter la vue-l'ajout de code à l'intérieur de l'achèvement de bloc, Xcode renvoyait un message d'erreur disant que je ne peux pas utiliser le moteur de mise en forme, le tout dans un processus d'arrière-plan. Donc j'ai trouvé un code sur de SORTE que tente de file d'une méthode sur le thread principal:
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)
})
Cependant, je ne sais pas comment faire pour ajouter les paramètres "receiveAddr" et "amountBTC" à cet appel de fonction. Comment pourrais-je faire cela, ou peut-on suggérer une façon optimale pour l'ajout d'un appel de méthode à la principale de l'application de la file d'attente?
Vous devez vous connecter pour publier un commentaire.
Viens d'écrire ce dans
completion handler
.Pas besoin d'utiliserdispatch_after
Swift 3/4:
Aussi pour expédition après sur la file d'attente principale
Remplacer
YourAppDelegateClass
avec vous, délégué de classeaddUIImage
écrit.Si c'est dansapp delegate
que cela va fonctionner.J'ai testé cela fonctionne correctementdisplayQRCode
n'importe où dans votre question, et j'ai suggéré que vous la façon dedispath
surmain thread
.Je ne sais pas quelle méthode de mise à jour de votre image.Comme votre mentionnée dans la réponse, ma réponse n'est queUIApplication.sharedApplication().sendAction("addUIImage"displayQRCode:", to: self.delegate, from: self, forEvent: nil)
qui vous avez édité et si quelqu'un voit votre question, il pensaitaddUIImage
fonction est sur votre délégué d'application et appdelegate n'est pas acessible parself.delegate
.Vous avez fait votre propre propriété dans votre classe.Etself.delegate
n'est pasYourAppDelegate
, sauf si vous définissez la propriété personnalisée et de l'affecter.DispatchQueue.main.asyncAfter(deadline: .now() + 0.1)
?Swift 3 & Swift 4 version:
Swift3 et XCode 9.2:
Swift 2
De Fuite à l'aide de Fermetures cela devient:
De fuite Fermetures est Swift sucre syntaxique qui permet de définir la fermeture de l'extérieur de la fonction du paramètre de portée. Pour plus d'informations, voir De Fuite Fermetures dans Swift 2.2 Langage de Programmation Guide.
Dans dispatch_async cas de l'API est
func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
depuisdispatch_block_t
est de type alias pour() -> Void
- Une fermeture qui reçoit 0 paramètres et n'ont pas de valeur de retour, et de bloquer le dernier paramètre de la fonction, nous pouvons définir la fermeture de l'extérieur de la portée dedispatch_async
.Voici la plus agréable (OMI) Swifty/Cacao syntaxe de style pour obtenir le même résultat que les autres réponses:
Ou vous pouvez prendre le populaire Async bibliothèque Swift pour les moins de code et plus de fonctionnalités:
Recharger collectionView sur le Thread Principal
La bonne façon de le faire est d'utiliser dispatch_async dans le main_queue, comme je l'ai fait dans le code suivant
Voici une jolie fonction globale, vous pouvez ajouter pour une meilleure syntaxe:
Et l'utilisation
N'oubliez pas de weakify auto si vous utilisez l'auto à l'intérieur de la clôture.