2017-09-29 2 views
0

PromiseKit fournit une méthode pratique thenOn pour l'exécution de pièces de votre chaîne sur des threads non principaux. Cependant, il ne semble pas y avoir de moyen pratique de définir le premier thread d'exécution de la promesse.Méthode PromiseKit firstlyOn

Cela signifie que je finis soit en plaçant un DispatchQueue.global(x).async dans ma première promesse, soit en utilisant une première promesse fictive.

Si je place le bit DispatchQueue dans ma première promesse comme étant rompu, je déplace la décision de thread de la chaîne d'exécution principale vers la promesse individuelle, mais uniquement pour cette promesse. Si je devais plus tard faire une promesse à ma chaîne, je dois déplacer toute cette logique de filetage ... pas bon.

Ce que j'ai fait dernièrement est la suivante:

let queue = DispatchQueue.global(qos: .userInitiated) 

    Promise(value:()).then(on: queue) { 

     // Now run first promise function 

    } 

Ceci est certainement une solution plus propre, mais je me demandais si quelqu'un connaissait une solution encore mieux ... Je suis sûr que ce ISN Est-ce un scénario rare après tout?

Répondre

0

Vous pouvez effectuer votre opération sur une file d'attente, il suffit d'appeler fulfill ou reject de lui

Regardez par exemple:

override func viewDidLoad() { 
    super.viewDidLoad() 

    firstly { 
     doFirstly() 
     } 
     .then { 
      self.doMain() 
     } 
     .then { 
      self.doLastest() 
     } 
     .catch { error in 
      // handle error 
     } 
     .always { 
      // finish 
    } 
} 

func doFirstly() -> Promise<Void> { 
    return Promise { fulfill, reject in 
     let queue = DispatchQueue.global(qos: .userInitiated) 
     queue.async { 
      // do your operation here 
      fulfill() 
     } 
    } 
} 

func doMain() -> Promise<Void> { 
    return Promise { fulfill, reject in 
     let queue = DispatchQueue.main 
     queue.async { 
      // do your operation here 
      fulfill() 
     } 
    } 
} 

func doLastest() -> Promise<Void> { 
    return Promise { fulfill, reject in 
     let queue = DispatchQueue.global(qos: .userInitiated) 
     queue.async { 
      // do your operation here 
      fulfill() 
     } 
    } 
} 
0

Nous fournissons:

DispatchQueue.global().promise { 
    //… 
} 

firstly ne prend pas file d'attente, car il exécute son contenu immédiatement pour le cas par défaut et lui permettant ainsi d'avoir une file d'attente configurée ferait son comportement ior variable confusément.