如何使用闭包在两个ViewController之间传递数据

时间:2017-06-14 09:32:15

标签: ios iphone swift swift3 closures

我想知道如何使用闭包传递数据。我知道有三种类型的数据传递方法:

  • 委托

  • 通知中心

  • 闭合

我希望通过一个例子对闭包进行适当的澄清。

2 个答案:

答案 0 :(得分:5)

使用块/闭包传递数据是一种合理的方法,并且比通知更好。 以下是相同的代码。

第一个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(数据传递回First VC)

import UIKit
typealias v2CB = (infoToReturn :String) ->()
class v2ViewController: UIViewController {
        var completionBlock:v2CB?
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func returnFirstValue(sender: UIButton) {
        guard let cb = completionBlock else {return}
        cb(infoToReturn: returnFirstValue)
    }

}

答案 1 :(得分:0)

此示例说明如何使用Alamofire进行服务调用,并将响应发送回调用View Controller并关闭。

Service Wrapper Class中的代码:

关闭声明

typealias CompletionHandler = (_ response: NSDictionary?, _ statusCode: Int?, _ error: NSError?) -> Void

方法中的关闭实现

    func doRequestFor(_ url : String, method: HTTPMethod, dicsParams : [String: Any]?, dicsHeaders : [String: String]?, completionHandler:@escaping CompletionHandler) {

        if !NetworkReachablity().isNetwork() {
            return
        }

        if (dicsParams != nil) {print(">>>>>>>>>>>>>Request info url: \(url) --: \(dicsParams!)")}
        else {print(">>>>>>>>>>>>>Request info url: \(url)")}

        Alamofire.request(url, method: method, parameters: dicsParams, encoding:
            URLEncoding.default, headers: dicsHeaders)

        .responseJSON { response in
            self.handleResponse(response: response, completionHandler: completionHandler)
        }
    }

调用视图控制器的代码:

        ServiceWrapper().doRequestFor(url, method: .post, dicsParams: param, dicsHeaders: nil) { (dictResponse, statusCode, error) in

        }