如何在 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")
}
}
我定义了一个块,在 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")
}
}