我已经定义了一个在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的后台块。
答案 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")
}
}