J'ai une boucle while qui boucle jusqu'à ce qu'une expression devienne vraie pour rompre la boucle, à l'intérieur de cette boucle j'ai dormi (1), tout fonctionne bien, le seul problème est que l'application est gelée jusqu'à la fin de la boucle while, ce qui est logique, J'essaie de trouver un moyen pour que l'application ne se fige pas pendant "pendant" le travail! Peut-être une programmation multithreading? c'est possible?
var repeatLoop = true
var count: Int = 0
while repeatLoop {
print(count)
count += 1
sleep(1)
if count >= 10
{
repeatLoop = false
}
}
print("finished!")
PS: Mon objectif est de trouver la réponse à cette question plutôt que de changer la façon de résoudre, je veux dire qu'il y a tellement de façons d'obtenir le même résultat sans dormir ni pendant.
3 Réponses :
L'application ne se fige pas si vous n'exécutez pas ce code sur le thread principal / UI.
Il existe plusieurs façons de le faire sur iOS. Voici un moyen rapide:
DispatchQueue.global(qos: .background).async
{
// Your code here.
}
@Omid Que voulez-vous dire; qu'est-ce que vous ne vous souciez pas de votre question?
Vous m'avez tous les deux donné la bonne réponse! Lequel devrais-je choisir?
@Omid Choisissez simplement la réponse que vous préférez. Matt donne un peu plus de détails (il a été plus rapide en ajoutant cela), donc un bon choix.
J'ai vu qu'il était quelques secondes plus rapide que vous, c'est pourquoi je prends cette réponse, mais merci beaucoup aussi, j'ai voté votre réponse à la place
Le thread / file d'attente principal est le thread / la file d'attente de l'interface, donc une activité chronophage gèle l'interface.
Peut-être la programmation multithreading
En effet. La réponse à votre question actuelle est: effectuez l'activité chronophage sur un thread / file d'attente en arrière - plan .
DispatchQueue.global(qos: .background).async {
// your code here
}
Bien sûr, cela soulève le spectre de problèmes liés à la concurrence impliquant plusieurs exécutions simultanées du même code, des conflits non thread-safe entre les accès aux données partagées, etc. Mais c'est le prix à payer pour faire des choses qui prennent du temps, et vous doivent apprendre à faire face.
Avec ce programme, vous ne pouvez pas! Vous devez rechercher des options dans votre cadre de programmation qui peuvent faire du multi threading. Votre fonction sleep () doit permettre à d'autres threads de s'exécuter.
Une bonne solution consiste à inverser la logique et à utiliser des minuteries. au lieu d'appeler sleep pour bloquer l'opération jusqu'à la prochaine interaction. Votre minuterie appellera votre routine plusieurs fois que vous le souhaitez.
Regardez ceci: Le guide ultime de la minuterie
Votre approche est erronée. Plutôt que d'attendre quelque chose, laissez l' expression avertir quand elle est terminée.
tu veux dire que je n'utilise pas If?
Tu ne devrais jamais
sleepOui, le sondage est une mauvaise pratique.
D'accord! Je sais ce que vous dites, j'ai besoin de mettre une sorte de retard dans chaque boucle, comment faire ça? Je connais la minuterie ou d'autres moyens, je suis intéressé par le sans minuterie, je sais aussi que je peux utiliser de nombreuses autres façons.
Génial, utilisez l'une des nombreuses autres façons sans la boucle.
merci, donc je suppose qu'il n'y a aucun moyen avec le temps et le sommeil d'éviter le gel.
Ne jamais dormir. Ne pensez même pas à dormir. Ne jamais dormir jamais. La fin.
qu'essayez-vous de réaliser? attendez-vous quelque chose (alors faites ce que dit vadian)? ou comptez-vous jusqu'à 10 par intervalles (utilisez alors des minuteries)? ou retardez-vous l'exécution de quelque chose (utilisez DispatchQueue alors)?
merci, bon à savoir, mais pourquoi dormons-nous?
Je suggérerais également d'utiliser
while trueavec unebreakpour rendre votre code un peu plus pratiquemerci, c'était aussi bon!