【问题标题】:Pass Data using Closures使用闭包传递数据
【发布时间】:2016-06-10 04:54:32
【问题描述】:

我知道有多种方法可以将数据从一个控制器传回另一个控制器,例如 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)

    }
}

【问题讨论】:

  • 这种方法没有问题,但请注意了解您的闭包如何捕获值并创建保留周期。
  • 是的,应该注意保留周期

标签: ios swift closures objective-c-blocks


【解决方案1】:

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

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

【讨论】:

  • 我还想知道一件事,我如何将多个不同的值传回是安全的方式,或者我应该使用包含块作为参数的方法传回数据。
  • 完全没问题。这是闭包的好处之一。
  • 谢谢哥们!!你真的解除了我的困惑
  • 是否有客观的 c 等价物?
  • @vnchopra 是的,从 macOS 10.6 Snow Leopard 开始,Objective-C 中就存在块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多