为什么我的数据无法使用闭包在视图控制器之间传递?

时间:2019-04-15 14:52:58

标签: swift

当用户单击按钮时,我试图将通过网络调用接收的数据传递给另一个视图控制器。在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)
        }
    }
}

2 个答案:

答案 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)
        }
    }
}
  1. oneRecipeFound从一开始就是空虚的生活:nil

  2. 在FirstVC中,单击该单元格。我们称oneRecipeFound。它仍然是nil,所以什么也没发生。

  3. 在SecondVC中,我们设置oneRecipeFound的值。现在它有一个值,但是调用已经发生。

因此,除非您口袋里装有一台时光机,否则您可以以某种方式逆转事件的顺序,否则,您概述的策略注定会失败。当然,如果在设置完后调用oneRecipeFound ,它将起作用。例如:

Class SecondVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        APIsRuler.oneRecipeFound = { result in
            print(result)
        }
        APIsRuler.oneRecipeFound?(oneRecipe) // prints
    }
}