2017-11-29 4 views
-1

私には機能があります。それは素晴らしい実行しますが、私はそれを再度呼び出す場合は、その関数はすでに完了していることを知っているので、私は再びそれを呼び出すしようと自動的に完了に渡します。完了ハンドラをリセットするにはどうすればよいですか?スウィフトで完了ハンドラをリセットする方法

コード:私はおよそ分後に再びそれを呼び出すようにした場合

self.Test(completionHandler: { finished in 
    print("We have completed function)") 
}) 

func Test(completionHandler: @escaping (_ finished: String?) -> Void) { 
    DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) { 
     completionHandler("finished") // tell the caller that this has completed 
    } 
} 

私はこのようにそれを呼び出します。それの代わりに10秒待っている。それは自動的に行を印刷します。

print("We have completed function)") 

知っているもの:

上記のコードは私の実際のコードはこれです試験例です。

func GoToPage(completionHandler: @escaping (_ finished: String?) -> Void) { 
     self.webView.evaluateJavaScript("document.getElementById('results').getElementsByClassName('page')[0].getElementsByClassName('name')[0].innerText"){ (value, error) in 
     if error != nil { 
     } else { 
     print(value) 
     completionHandler("finished") 
     } 
     } 
} 

私はこのようにそれを呼び出す:

 self.GoToPage(completionHandler: { finished in 
    print("We have completed function)") 
    }) 

その後、私は1つ1〜2分待ってから、次のように再び同じようにそれを呼び出します。

DispatchQueue.main.asyncAfter(deadline: .now() + 130.0) { 
    self.GoToPage(completionHandler: { finished in 
    print("We have completed function") 
    }) 
    } 

これは私にラインをプリントします。コールされるとバットの機能を完璧に終えました。

例:

これは、動作するようになっているとして、それが働いている一緒に

 self.GoToPage(completionHandler: { finished in 
    print("We have completed function)") 
    NextStep() 
    }) 


    func NextStep(){ 
    DispatchQueue.main.asyncAfter(deadline: .now() + 130.0) { 
    self.GoToPage(completionHandler: { finished in 
    print("We have completed function") 
    }) 
    } 
    } 


    func GoToPage(completionHandler: @escaping (_ finished: String?) -> Void) { 
     self.webView.evaluateJavaScript("document.getElementById('results').getElementsByClassName('page')[0].getElementsByClassName('name')[0].innerText"){ (value, error) in 
     if error != nil { 
     } else { 
     print(value) 
     completionHandler("finished") 
     } 
     } 
     } 
+0

これは非常に混乱しやすい質問です。あなたは* "それはその機能がすでに" * "の前に完了していることを知っていますか?あなたの問題を示す例を示してください。 – rmaddy

+0

私は質問 – Hunter

+0

を更新しました。何分待ってから「テスト」をもう一度呼びますか? – rmaddy

答えて

1

それをすべてを置きます。
DispatchQueue.main.asyncAfterは非同期関数です。つまり、self.testを呼び出すと、メインスレッドに非同期に10秒待機するように要求した後に関数が戻り、すぐにその関数に2回目の処理を依頼します。
あなたは関数が最初の実行を待つしたい場合は、これを行うための一つの方法は、その完了ハンドラに二度目の関数を呼び出すことです:

self.Test(completionHandler: { finished in 
    print("We have completed function)") 
    self.Test(completionHandler: { finished in 
     print("We have completed function)") 
    }) 
}) 

EDIT:遊び場でコードを。約10秒後に2番目の機能を表示します。

class TestAsyncAfter { 

    func nextStep(){ 
     DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) { 
      self.goToPage(completionHandler: { finished in 
       print("We have completed function") 
      }) 
     } 
    } 

    func goToPage(completionHandler: @escaping (_ finished: String?) -> Void) { 
     completionHandler("finished") 
    } 
} 

let test = TestAsyncAfter() 
test.goToPage(completionHandler: { finished in 
    print("We have completed function") 
    test.nextStep() 
}) 

PlaygroundPage.current.needsIndefiniteExecution = true 
+0

ok私はちょっと混乱しています。 – Hunter

+0

@Hunter:2分待っているコードを表示します。 –

+0

私は答えを返しました – Hunter

関連する問題