159

私はこれにどのようにアプローチするかについて興味がありました。関数があり、それが完全に実行されたときに何かを実行したい場合、これを関数にどのように追加しますか? ありがとう

4

7 に答える 7

115

私は答えを理解するのに苦労したので、私のような他の初心者は私と同じ問題を抱えていると思います.

私の解決策はトップの回答と同じですが、初心者や一般的な理解に問題がある人にとっては、もう少し明確で理解しやすいことを願っています.

完了ハンドラを持つ関数を作成するには

func yourFunctionName(finished: () -> Void) {

     print("Doing something!")

     finished()

}

機能を使用するには

     override func viewDidLoad() {

          yourFunctionName {

          //do something here after running your function
           print("Tada!!!!")
          }

    }

あなたの出力は

なんかやってる

多田!!!

お役に立てれば!

于 2017-01-08T23:29:12.127 に答える
18

Swift 5.0 + 、シンプルで短い

例:

スタイル 1

    func methodName(completionBlock: () -> Void)  {

          print("block_Completion")
          completionBlock()
    }

スタイル 2

    func methodName(completionBlock: () -> ())  {

        print("block_Completion")
        completionBlock()
    }

使用する:

    override func viewDidLoad() {
        super.viewDidLoad()
        
        methodName {

            print("Doing something after Block_Completion!!")
        }
    }

出力

block_Completion

Block_Completion の後に何かをする!!

于 2019-12-20T11:18:12.113 に答える
1

上記に加えて:トレーリング クロージャを使用できます。

downloadFileFromURL(NSURL(string: "url_str")!)  { (success) -> Void in

  // When download completes,control flow goes here.
  if success {
      // download success
  } else {
    // download fail
  }
}
于 2016-08-27T17:05:37.380 に答える
0

カスタムメイドの完了ハンドラについて少し混乱しています。あなたの例では:

ネットワークからファイルをダウンロードするダウンロード機能があり、ダウンロード タスクが終了したときに通知を受け取りたいとします。

typealias CompletionHandler = (success:Bool) -> Void

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {

    // download code.

    let flag = true // true if download succeed,false otherwise

    completionHandler(success: flag)
}

あなた// download codeはまだ非同期で実行されます。ダウンロードコードが完了するのを待たずに、なぜコードが直接あなたに届かないのでしょうlet flag = trueか?completion Handler(success: flag)

于 2016-01-06T23:55:24.867 に答える