DispatchWorkItem - annuler une tâche

Bonsoir,


 


J'ai actuellement le code suivant dans une fonction de ma classe :



let task1 = DispatchWorkItem { self.object1.changeColor() }
let when1 = DispatchTime.now() + 1
DispatchQueue.main.asyncAfter(deadline: when1, execute: task1)

cependant je souhaiterais annuler cette tâche dans une autre fonction, en faisant 



task1.cancel()

Comment déclarer task1 pour l'utiliser dans toute la classe ?


 


Merci.


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    Comme d'habitude. Comme un let au niveau de la classe à  la place du niveau de la méthode.
  • Mais la déclaration c'est : 



    init(qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, block: @escaping () -> Void)

    donc si je mets ceci au niveau de la classe :



    let task1 = DispatchWorkItem()

    ce n'est pas bon.

  • Pourquoi pas



    var task1:DispatchWorkItem?

    au niveau de la classe ?


  • Joanna CarterJoanna Carter Membre, Modérateur

    @helio - peut-être tu peux nous montrer un peu plus de ton code ? C'est difficile d'imaginer ce que t'as écrit / veux écrire


  • Joanna CarterJoanna Carter Membre, Modérateur
    juillet 2017 modifié #6

    Ah je viens de me rendre compte de ce que tu parles.


     


    C'est une lazy var qui te conviendra :



    class MyClass
    {
    ...

    lazy var task: DispatchWorkItem =
    {
    let task = DispatchWorkItem(qos: .background, flags: .detached, block:
    {
    self.object1.changeColor()
    })

    return task
    }()

    ...

    Mais, si tu n'as pas besoin de modifier les paramètres par défaut comme qos et flags, c'est :



    class MyClass
    {
    ...

    lazy var task: DispatchWorkItem =
    {
    let task = DispatchWorkItem
    {
    self.object1.changeColor()
    }

    return task
    }()

    ...

  • Merci ! ça marche.

Connectez-vous ou Inscrivez-vous pour répondre.