回答:
ネットワークからファイルをダウンロードするダウンロード機能があり、ダウンロードタスクが完了したときに通知を受け取るとします。
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)
}
// How to use it.
downloadFileFromURL(NSURL(string: "url_str")!, { (success) -> Void in
// When download completes,control flow goes here.
if success {
// download success
} else {
// download fail
}
})
それが役に立てば幸い。
私は答えを理解するのに苦労したので、私のような他の初心者が私と同じ問題を抱えていると思います。
私の解決策は上の答えと同じですが、うまくいけば、初心者や一般的に理解するのが難しい人のために、もう少し明確で理解しやすいでしょう。
完了ハンドラーを使用して関数を作成するには
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
関数を使用するには
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
あなたの出力は
なんかやってる
多田!!!
お役に立てれば!
簡単なSwift 4.0の例:
func method(arg: Bool, completion: (Bool) -> ()) {
print("First line of code executed")
// do stuff here to determine what you want to "send back".
// we are just sending the Boolean value that was sent in "back"
completion(arg)
}
どうやって使うのですか:
method(arg: true, completion: { (success) -> Void in
print("Second line of code executed")
if success { // this will be equal to whatever value is set in this method call
print("true")
} else {
print("false")
}
})
この目的でクロージャーを使用できます。以下をお試しください
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
ある時点で、以下のようにこの関数を呼び出すことができます。
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
クロージャーについて詳しくは、以下のリンクを参照してください。
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の後で何かします!!
カスタムメイドの完了ハンドラーについて少し混乱しています。あなたの例では:
ネットワークからファイルをダウンロードするダウンロード機能があり、ダウンロードタスクが完了したときに通知を受け取りたいとします。
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)
あなたのダウンロードコードが終了されるのを待たずに?