2017-12-14 18 views
0

で配列から関数を呼び出すことの私はこの関数の配列を持っているとしましょう:時間遅れ

lazy var funcArray = [firstFunc, secondFunc, thirdFunc, ....n+Func, ...Inifinit number of Func........] 

はどのようにして2.5秒遅れで次々にそれらを呼ぶだろうか?

私は成功せず、このwhileループなど、多くのことを試してみました:

while n < funcArray.count { 
    funcArray[n]() 

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) { 
     n = n +1 
    } 
} 
+0

afterDelayでperformSelectorを使用する再帰関数が機能するのだろうか? – koropok

答えて

0

私はよりよく理解するための小さなコードを書くに動作します。

初期化カウントとfuncTimer変数と作成された静的関数配列。その後

var count:Int = 0 
var funcTimer = Timer() 
let funcArray:Array = [somefunc(),somefunc(),somefunc()] 

ので、これはあなたのために動作します適切な場所に

funcTimer = Timer.scheduledTimer(timeInterval: 2.5, target: self, selector: (#selector(ViewController.scheduleArrayFunctions)), userInfo: nil, repeats: true) 

@objc func scheduleArrayFunctions(funcarray:[ String]) 
{ 
    if count < self.funcArray.count { 

     //this if is interesting checking both static function when it check it call the somefunc method 
     if self.funcArray[count] == ViewController.somefunc(){ 
      print("equel") 
     } 
     self.count += 1 
    } 
    else 
    { 
     funcTimer.invalidate() 
    } 

} 

func somefunc() 
{ 
    print("hello world") 
} 

希望をこれらの行を追加します。

0

私はこれが動作すると思います。次の手順を実行します。

  • 可変カウントをゼロとして宣言します。
  • タイマーを時間間隔2.5でスケジュールし、繰り返します。
  • 今度は、タイマーコールバックブロック内のindex as countという配列から関数を呼び出します。
  • カウントがarray.countより小さいかどうかを確認します。
  • カウントをインクリメントします。
  • それ以外の場合は、タイマーを停止します。
+0

カウントが大きすぎるとタイマーを止めることを忘れないでください。 – rmaddy

+0

私はこれを試しましたが、うまくいきませんでしたが、私はうなずいています...代わりにループを機能させるために関数を実行しました – Alex

0

私はループ おそらく悪いコーディングを機能させる機能をしましたけど...それは

 n = 0    

     self.funcArray[n]() 

     n = n + 1 

     timerAction() 

func timerAction() { 



    let when = DispatchTime.now() + 2.5 
    DispatchQueue.main.asyncAfter(deadline: when) { 
    self.funcArray[self.n]() 


    self.n = self.n + 1 

     if self.n < self.funcArray.count { 

    self.timerAction2() 

     } 

    } 

} 

func timerAction2() { 



    let when = DispatchTime.now() + 2.5 
    DispatchQueue.main.asyncAfter(deadline: when) { 
     self.funcArray[self.n]() 
    } 

    if self.n < self.funcArray.count { 

     self.timerAction() 

    } 



    } 
+0

これはあなたの質問に対する完全な答えでしょうか?答え(私たち自身でさえ)は説明する必要があります。コードを投稿するだけではありません。これが実際に回答でない場合は、この回答を削除し、必要に応じて質問を更新してください。 – rmaddy

+0

これは私の答えです。 – Alex