2016-06-10 69 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