2016-11-14 5 views
1

前の機能の情報に依存している3つの機能の実行に誰かが助けてくれるのだろうかと思っていました。 これは私が前のポストから見つかったコードどのような作業に2を取得するには、次のとおりです。すぐに3つの機能を実行する

func firstTask(completion: (success: Bool) -> Void) { 
    // Do something 

    // Call completion, when finished, success or faliure 
    completion(success: true) 
} 

//And use your completion block like this: 
firstTask { (success) -> Void in 
    if success { 
     // do second task if success 
     secondTask() 
    } 
} 

しかし、あなたは二番目の完了後に実行したい場合には、3番目の機能が行くのでしょうか? 申し訳ありませんが、これは本当に基本的な質問ですが、私はまだプログラミングとスウィフトのハングを取得しています。

ありがとうございました!

+1

再度同じパターンを使用してください。 'secondTask {......... //成功すれば// 3番目のタスクを実行}' – Thilo

+0

@Thiloこれはかなりのパターンです。関数をチェーンにバインドさせます。彼らは再利用可能ではありません/モジュラー – Alexander

+0

まあ、それはNikoの答えで非常にきれいに見えます。しかし、ええ、あなたはおそらくコールバックを避けるためにいくつかの図書館を引っ張りたいです。 – Thilo

答えて

1

戻り値として結果を返し、中間変数を使用して関数を連鎖させることをお勧めします。

完了ハンドラを過度に使用しないようにしてください。例外的にコードをナビゲートするのは困難です。可能な限り、戻り値を使用すること

func produceASCIIHexCodes() -> [UInt8] { 
    return [0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21] 
} 

func convertToUnicodeScalars(hexCodes: [UInt8]) -> [UnicodeScalar] { 
    return hexCodes.map(UnicodeScalar.init) 
} 

func convertToCharacters(unicodeScalars: [UnicodeScalar]) -> [Character] { 
    return unicodeScalars.map(Character.init) 
} 

func createString(fromCharacters characters: [Character]) -> String { 
    return String(characters) 
} 

func display(string: String) { 
    print(string) 
} 

let hexCodes = produceASCIIHexCodes() 
let unicodeScalars = convertToUnicodeScalars(hexCodes: hexCodes) 
let characters = convertToCharacters(unicodeScalars: unicodeScalars) 
let string = createString(fromCharacters: characters) 
display(string: string) 
1

あなたは(運動場でテスト済み)

import UIKit 
import Foundation 

func firstTask() -> Bool { 
    // Do something 
    print("First task") 
    return true // change this to determine the task success or not 
} 

func secondTask() -> Bool { 
    // Do something 
    print("Second task") 
    return true // change this to determine the task success or not 
} 

func thirdTask() { 
    // Do something 
    print("Third task") 
} 

let thirdBlock: (_ success: Bool) ->() = { success in 
    guard success else { return } 
    thirdTask() 
} 

let secondBlock: (_ success: Bool) ->() = { success in 
    guard success else { return } 
    let success = secondTask() 
    thirdBlock(success) 
} 

let firstBlock:() ->() = { 
    let success = firstTask() 
    secondBlock(success) 
} 

firstBlock() 

あなたはどちらかReactiveCocoaまたはRxSwiftで、リアクティブプログラミングを学ぶと、このコールバック地獄から身を保存することができ、このようにそれを宣言することができます。

関連する問題