使用闭包传递数据

Pass Data using Closures

我知道有多种方法可以将数据从一个控制器传回另一个控制器,例如 Delegates, NSNotifications。我正在使用另一种方式使用 Closures 将数据数据传回。我只想知道我如何使用如下所示的块传递任何数据是否安全,或者我应该避免这种方法。

第一个ViewController(我把第二个ViewController作为对象)

 @IBAction func push(sender: UIButton) {
        let v2Obj = storyboard?.instantiateViewControllerWithIdentifier("v2ViewController") as! v2ViewController

        v2Obj.completionBlock = {(dataReturned) -> ()in
            //Data is returned **Do anything with it **

            print(dataReturned)

        }
        navigationController?.pushViewController(v2Obj, animated: true)

    }

第二个ViewController(数据传回第一个VC)

import UIKit
typealias v2CB = (infoToReturn :NSString) ->()
class v2ViewController: UIViewController {

    var completionBlock:v2CB?
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    @IBAction func returnFirstValue(sender: UIButton) {

        guard let cb = completionBlock else {return}

        cb(infoToReturn: returnFirstValue)

    }
    @IBAction func returnSecondValue(sender: UIButton) {

        guard let cb = completionBlock else {return}

        cb(infoToReturn: returnSecondValue)

    }
}

这是一个非常好的和合理的方法,比通知要好得多。

看看 Cocoa API 的 演变 你会注意到 Apple 已经用块/闭包替换了越来越多的委托 API多年来。