2017-05-26 1 views
0

Je me demande juste quelle est la meilleure implémentation de multi-temporisateurs polyvalents optimisés pour la mémoire dans swift. Les minuteurs qui sont concurrentes et ont référence faible avec Dispatch? J'ai essayé d'implémenter deux minuteurs dans un contrôleur de vue et j'ai eu une erreur.Comment implémenter la minuterie multiple optimisée dans swift?

un de mes minuterie était comme ça:

func startOnPlayingTimer() { 

let queue = DispatchQueue(label: "com.app.timer") 
onPlayTimer = DispatchSource.makeTimerSource(queue: queue) 
onPlayTimer!.scheduleRepeating(deadline: .now(), interval: .seconds(4)) 
onPlayTimer!.setEventHandler { [weak self] in 
    print("onPlayTimer has triggered") 
} 
onPlayTimer!.resume() 
} 

un autre était:

carouselTimer = Timer.scheduledTimer(timeInterval: 3, target: self,selector: #selector(scrollCarousel), userInfo: nil, repeats: true) 
+1

Je voudrais simplement créer plusieurs instances de 'Timer'. Quelle erreur obtenez vous? – Paulw11

+0

@ Paulw11 En fait, je pourrais l'implémenter avec 'Timer' aujourd'hui. mais je doute que cette fonction soit sûre? et a une "référence faible"? Je cherche à implémenter ceci avec Dispatch et le rende sûr de fil et mémoire optimisée. – Omnia

+0

La sécurité des filetages et les références fortes cicrcular sont des issues séparées à la minuterie. L'approche sans temporisation vous donnera la sécurité inhérente de fil. La sécurité du fil dépend de ce que vous faites dans la fermeture qui est envoyée par la minuterie. Les minuteries peuvent avoir un impact sur la consommation d'énergie et, en fait, Apple conseille de ne pas utiliser les minuteurs comme technique de synchronisation; https://developer.apple.com/library/content/documentation/Performance/Conceptual/EnergyGuide-iOS/MinimizeTimerUse.html. – Paulw11

Répondre

0

Je ne pense qu'il est nécessaire de minuterie multiples pour toutes les applications. Si vous connaissez d'avance les méthodes que vous allez utiliser, Conservez une valeur booléenne pour chaque méthode que vous avez besoin de déclencher et Int pour enregistrer l'occurrence de la méthode. Vous pouvez appeler le minuteur une fois, avec une méthode qui vérifie le booléen requis et sa méthode respective.

Un code pseudo faisant référence à la logique ci-dessus est au-dessous:

class ViewController: UIViewController { 


var myTimer : Timer! 

var methodOneBool : Bool! 
var methodTwoBool : Bool! 
var mainTimerOn : Bool! 


var mainTimerLoop : Int! 
var methodOneInvocation : Int! 
var methodTwoInvocation : Int! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    configure() 
} 

func configure(){ 
    methodOneBool = false 
    methodTwoBool = false 

    methodOneInvocation = 5 // every 5 seconds 
    methodTwoInvocation = 3 //every 3 seconds 

    mainTimerOn = true // for disable and enable timer 
    mainTimerLoop = 0 // count for timer main 
} 

func invokeTimer(){ 
    myTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(checkTimerMethod), userInfo: nil, repeats: true) 
} 


func checkTimerMethod(){ 

    if(mainTimerOn){ 

     if(mainTimerLoop % methodOneInvocation == 0 && methodOneBool){ 
      // perform first method 
      // will only get inside this when 
      // methodOneBool = true and every methodOneInvocation seconds 
     } 

     if(mainTimerLoop % methodTwoInvocation == 0 && methodTwoBool){ 
      // perform second method 
      // will only get inside this when 
      // methodTwoBool = true and every methodTwoInvocation seconds 
     } 

     mainTimerLoop = mainTimerLoop + 1 

    } 
} 

} 

J'espère que cela efface le problème, même si je ne comprenais pas votre exigence s'il vous plaît commentaire ci-dessous, afin que je puisse modifier la réponse en conséquence

+1

IMO il est beaucoup plus simple juste d'avoir deux minuteries – Paulw11

+0

Timer sont des objets très lourds et prend beaucoup de mémoire pour invoquer AFAIK, donc c'est bon de maintenir le moins possible –

+0

. Choisissez toujours la solution la plus simple et optimisez-la si nécessaire, une fois que vous avez déterminé qu'il y a un problème. Votre solution a beaucoup plus de "pièces mobiles" et donc de bugs potentiels – Paulw11