从委托的源 ViewController 调用异步闭包
Posted
技术标签:
【中文标题】从委托的源 ViewController 调用异步闭包【英文标题】:Calling an asynchronous closure from a delegate's source ViewController 【发布时间】:2019-02-27 12:35:19 【问题描述】:我有以下设置:
Launch VC 在闭包dataGatheringClosure
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 返回?
iOS iPad 应用程序:未调用具有两个 UIScrollViews 和一个 UIPageControl 的 ViewController 的委托(未调用分页的委托函数)