从委托的源 ViewController 调用异步闭包

Posted

技术标签:

【中文标题】从委托的源 ViewController 调用异步闭包【英文标题】:Calling an asynchronous closure from a delegate's source ViewController 【发布时间】:2019-02-27 12:35:19 【问题描述】:

我有以下设置:

    Launch VC 在闭包dataGatheringClosure

    中执行异步 API 请求

    dataGatheringClosure 闭包的完成处理程序使用协议方法 setData 通过委托将结果传递给 VC1

    setData 内,VC1 使用以下代码将结果传递给 VC2

    if let vc2 = self.tabBarController?.viewControllers?[1] as? VC2Controller 
        vc2.data = result
    
    

我能够将数据从 Launch VC 传输到 VC2,但现在我需要通过在 Launch 中执行 dataGatheringClosure 来刷新数据风险投资

我的问题是:如何从 VC2 访问 Launch VC 的方法?这种方法合理吗?

作为一种解决方法,我在 TabBar VC 中复制了 dataGatheringClosure 闭包代码并让 VC 2 调用其 self.tabBarController.dataGatheringClosure 方法。但是,它是重复的,而且我不知道在 TabBarController 中执行繁重的 API 请求是否是最佳实践。

【问题讨论】:

看看这个 repo 只是展示了如何在视图控制器中来回传输数据github.com/shauket/DataViewController 【参考方案1】:

第一步是将数据从 ViewControllers 中分离出来。创建一个如下所示的单例类,并使用它来传递您需要的数据。

class Data 

    static let shared = Data()
    // Declare any other data properties you need here...
    var result = [String]()

    private init() 

    func initialize() 
        // Write code to initialize the data
        refresh()
    

    func refresh() 
        // Write code to refresh the data
    

在应用启动时或任何需要的地方使用以下代码初始化数据:

Data.shared.initialize()

您现在可以使用静态变量 Data.shared 从应用内的任何位置访问数据。要刷新数据,您可以执行以下操作:

Data.shared.refresh()

希望这会有所帮助。

【讨论】:

看看这个问题***.com/q/137975/2299040 @SahilManchanda 如果我避免使用单例,有哪些替代方法可以在我的控制器之间来回通信? ***.com/q/5210535/2299040 这会给你一个很好的方向:) 委托和单例都是不错的选择。使用单例时,请确保在不再需要它们时释放内存。只需设置 Data.shared = nil。声明应更改为:静态让共享:数据! = 数据()。根据您当前的情况使用它们。 在我的一个应用程序中,我使用了单例,每当应用程序收到来自 iCloud 的通知时,它非常适合对数据进行异步刷新。在我的例子中,许多 ViewController 共享相同的数据(用于应用程序的生命周期)并且达到了目的。

以上是关于从委托的源 ViewController 调用异步闭包的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 StoryBoard 的两个 ViewController 之间使用委托?

iOS:通过委托方法从推送的 ViewController 返回?

从 ViewController 调用 nib 方法

未调用委托方法

iOS iPad 应用程序:未调用具有两个 UIScrollViews 和一个 UIPageControl 的 ViewController 的委托(未调用分页的委托函数)

子 ViewController 不调用父类中声明的委托方法