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

How to create multiple instance of block in Swift?

我定义了一个块,在 webservice 调用后 return。

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 的背景块。

这样做不是个好主意,但如您所愿,请遵循以下代码。

您可以将块添加到 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")
    }
}

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

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")
  }
}