当用户单击按钮时,我试图将通过网络调用接收的数据传递给另一个视图控制器。在FirstVC上进行打印时,数据已经存在,但是在SecondVC中打印结果时,没有更多价值。我不想使用委托,而是使用闭包。 另外,当尝试保留内存周期时,会出现错误...
class APIsRuler {
static var oneRecipeFound: ((OneRecipeSearch) -> ())?
}
class FirstVC: UIViewController {
func cellIsClicked(index: Int) {
APIsRuler.shared.getRecipe(from: recipeID) { (success, oneRecipe) in
if success, let oneRecipe = oneRecipe {
APIsRuler.oneRecipeFound?(oneRecipe)
self.performSegue(withIdentifier: "goToSecondVC", sender: self)
}
}
}
}
Class SecondVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
APIsRuler.oneRecipeFound = { result in
print(result)
}
}
}
答案 0 :(得分:0)
在SecondVC中进行
APIsRuler.oneRecipeFound = { result in
print(result)
}
第一个
APIsRuler.oneRecipeFound?(oneRecipe)
没有内部通信,您需要在segue之后直接从secondVc中的共享类读取数据或将数据发送到
self.performSegue(withIdentifier: "goToSecondVC", sender: <#Herererere#>)
并实施prepareForSegue
答案 1 :(得分:0)
让我们考虑一下事情发生的顺序:
class APIsRuler {
static var oneRecipeFound: ((OneRecipeSearch) -> ())? // 1
}
class FirstVC: UIViewController {
func cellIsClicked(index: Int) {
APIsRuler.shared.getRecipe(from: recipeID) { (success, oneRecipe) in
if success, let oneRecipe = oneRecipe {
APIsRuler.oneRecipeFound?(oneRecipe) // 2
self.performSegue(withIdentifier: "goToSecondVC", sender: self)
}
}
}
}
Class SecondVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
APIsRuler.oneRecipeFound = { result in // 3
print(result)
}
}
}
oneRecipeFound
从一开始就是空虚的生活:nil
。
在FirstVC中,单击该单元格。我们称oneRecipeFound
。它仍然是nil
,所以什么也没发生。
在SecondVC中,我们设置oneRecipeFound
的值。现在它有一个值,但是调用已经发生。
因此,除非您口袋里装有一台时光机,否则您可以以某种方式逆转事件的顺序,否则,您概述的策略注定会失败。当然,如果在设置完后调用oneRecipeFound
,它将起作用。例如:
Class SecondVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
APIsRuler.oneRecipeFound = { result in
print(result)
}
APIsRuler.oneRecipeFound?(oneRecipe) // prints
}
}