如何在Swift中创建多个块实例?

时间:2018-06-07 13:01:26

标签: swift block

我已经定义了一个在webservice调用后返回的块。

typealias Receive  = ([AnyHashable : Any]) -> Void

func method(_ paramter: paramter, block:@escaping Register){
   //some code
}

我已经从appDelegate.swift调用此方法。

handler.shared.method(_ paramter) { (isGranted, token, error) in
   //some code
}

这是按预期工作的。

现在,如果我从viewcontroller.swift调用相同的方法,则在获得响应后,块仅在viewcontroller中进入。

我想创建同一个块的多个实例,这样当我得到响应时,它应该输入appdelegate&以及viewcntroller的后台块。

2 个答案:

答案 0 :(得分:1)

这样做并不是一个好主意,但正如您所坚持的那样,请遵循以下代码。

您可以在whereToPassData中添加块,并在每次收到响应时通知所有人。

import Foundation
import UIKit

public class AppGlobalManager:NSObject {
    static let sharedManager = AppGlobalManager()

    private override init() {
        super.init()
        //This prevents others from using the default '()' initializer for this class.
    }

    var whereToPassData:[Register?] = []

    typealias Register  = ([AnyHashable : Any]) -> Void

    func method(_ paramter:Any, block:@escaping Register){
        //some code
        for ref in whereToPassData {
            ref?(["test":"test"])
        }
        self.whereToPassData.removeAll()
    }
}

public class yourvc :UIViewController {
    public override func viewDidLoad() {
        var block = { (test:[AnyHashable : Any]) in
        }

        AppGlobalManager.sharedManager.whereToPassData.append(block)
        AppGlobalManager.sharedManager.method(for: "test")
    }
}

答案 1 :(得分:0)

我会从方法链接响应。当我的应用程序委托需要数据时,让视图控制器继续响应。在下面的示例中,成功参数被链接以提供重试。但是你可以用这个块参数模式传递整个响应。

func pull(data: @escaping ((_ response: String, _ success: Bool) -> Void)) {
  let code = arc4random_uniform(2) == 0 ? true : false
  let response = (code ? "pulled some data" : "incomplete data")
  data(response, code)
}


func someButtonTapped(needsRecall: ((_ outerSuccess: Bool) -> Void)?) {
  pull { (response, success) in
    if let checkRecall = needsRecall { checkRecall(!success) }
    if success {
      print(response)
    } else {
      print("failed to pull data")
    }
  }
}

someButtonTapped { (needsRecall) in
  if needsRecall {
    someButtonTapped(needsRecall: nil)
  } else {
    print("success")
  }
}