2016-04-16 6 views
1

Ich versuche, eine Funktion 10 Mal in zufälligen Abständen zwischen ihnen zu rufen.Aufruf Funktion periodisch in zufälligen Abständen in Swift

Wie kann ich das erreichen?

Ich kam mit einer Methode, aber ist schrecklich hässlich. Es sieht so aus:

var counter = 0 
    NSTimer.scheduledTimerWithTimeInterval(arc4random_uniform(4)+2, target: self, selector: Selector("createNewTimer"), userInfo: nil, repeats: false) 

    func createNewTimer(){ 
    // PERFORM STUFF YOU NEED TO 
    counter++ 

    if counter <= 10{ 
     NSTimer.scheduledTimerWithTimeInterval(arc4random_uniform(4)+2, target: self, selector: Selector("createNewTimer"), userInfo: nil, repeats: false) 
    } 
    } 

Gibt es eine schönere Möglichkeit, in zufälligen Intervallen die Funktion aufzurufen?

Antwort

2

Versuchen Sie dies auf dem Spielplatz. Hoffe es hilft:

func after(delay: Double, block:() -> Void) { 

     let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) 

     dispatch_after(delayTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
      block() 
     } 
    } 

    func repeatBlock(counter: Int = 1, times: Int, block:() -> Void) { 

     after(Double(arc4random_uniform(4) + 2)) { 

      block() 

      if counter < times { 
       repeatBlock(counter + 1, times: times, block: block) 
      } 
     } 
    } 

    //client's code 
    var counter = 0 
    repeatBlock(times: 10) { 
     //your code here 
     print(NSDate()) 
    } 
    sleep(100) 
+0

Warum brauchen Sie eine 'After'-Instanz dafür? Sie verwenden diese Instanz nie für irgendetwas. Mach einfach eine Top-Level-Funktion. Außerdem würde ich sehr vorsichtig damit sein, in eine globale Warteschlange zu dispatchen (besonders wenn ich mit der UI arbeite). Das Dispatching in die Hauptwarteschlange wäre weitaus besser für die Thread-Sicherheit. – Hamish

+0

Ich bevorzuge besser strukturierten Code. "Nachher" ist hier eine Basiseinrichtung, die woanders genutzt werden kann. –

+0

Es hängt davon ab, ob die Hauptwarteschlange verwendet werden soll oder nicht. Ich bevorzuge es, die Auslastung dieser Warteschlange so gering wie möglich zu halten. Wenn diese Frage regelmäßige UI-Manipulationen annimmt, stimme ich Ihnen zu. Aber das ist nicht explizit in der Frage angegeben. –

-1

Wenn Sie eine zufällige Intervalle benötigen, dann habe ich Angst, das obige ist die beste Lösung. Wenn das Zeitintervall gleich war, könnten Sie es auf repeats:true setzen. Aber nicht in dir.

Verwandte Themen