2016-06-10 45 views
1

我知道有多种方法可以将数据从一个控制器传回另一个控制器,如Delegates, NSNotifications。我使用另一种方式使用Closures来传回数据。我只想知道如何通过下面的块传递任何数据是安全的方式,还是应该避免使用这种方法。使用闭包传递数据

第一视图控制器(在这里我做第二个视图控制器的对象)

@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) 

    } 

二视图控制器(其中数据传回第一个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) 

    } 
} 
+0

这种方法没有问题,但要小心了解您的闭包如何捕获值并可以创建保留周期。 – Jonah

+0

是保留周期应该注意的 – ankit

回答

2

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

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

+0

有一件事我想知道,我怎么传回多个不同的值是安全的方式,或者我应该使用包含块作为参数的方法传回数据。 – ankit

+0

这很好。这是关闭的好处之一。 – vadian

+0

谢谢你!你真的摆脱了我的甩手混乱 – ankit