【发布时间】:2021-07-09 07:07:59
【问题描述】:
在我的应用中,它在同一屏幕下方有两个 ViewController。
-
ViewControllerA是一个 UIViewController,其中包含一个 tableView。 -
ViewControllerB是一个 containerView,它在 UITabBarController(root VC) 的顶部。
目前,我在viewWillAppear 的ViewControllerA 中加载数据(歌曲数组、索引等),这将在后台队列中。同时ViewControllerB在ViewControllerA的数据加载完成后需要相同的数据。
目前,我正在使用依赖注入来保持唯一的数据源。在 ViewController A 和 B 中声明 modelController 引用,并使用 getter 和 setter 来绑定数据变化。
问题是从ViewControllerB 中的modelController 获取的歌曲数组为零。因为ViewControllerA会在加载完成时在modelController上设置数据。而ViewControllerB 将在其viewWillAppear 中的modelController 中使用它。但这两个VC在同一个屏幕上,我怎么能保证谁先走呢?数据加载也在后台队列中,所以它被认为是延迟的。那么如果ViewControllerB首先需要这些数据,那就不可能了。
我目前的想法是在ViewControllerB 上也加载数据,所以它不会依赖ViewControllerA 的结果。或者当数据准备好时添加一些观察者/听众到消息ViewControllerB。我认为这是一种建筑学的东西,我需要有经验的人的建议,任何提示都表示赞赏!
创建并注入 ModelController
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
guard let rootViewController = window?.rootViewController as? TabBarController else {
fatalError("Unexpected Root View Controller")
}
// create dependency injection here
rootViewController.modelController = ModelController()
AudioManager.shared.modelController = rootViewController.modelController
}
模型控制器
enum PlayMode: String {
case cycle = "repeat"
case cycleOne = "repeat.1"
case shuffle = "shuffle"
}
class ModelController {
var songs: [Song]? = nil
var position: Int = 0
var playMode = PlayMode.cycle
}
Getter 和 Setter
var modelController: ModelController!
var songs: [Song]?
{
get { modelController.songs }
set { modelController.songs = newValue }
}
var position: Int
{
get { modelController.position }
set { modelController.position = newValue }
}
在ViewControllerA中加载数据。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
loadData()
}
func loadData() {
self.showSpinner()
songs?.removeAll()
DispatchQueue.global(qos: .background).async { [weak self] in
self?.songs = DataFetcher.shared.fetchMetaData().0
DispatchQueue.main.async {
print("data load complete")
self?.table.reloadData()
self?.removeSpinner()
}
}
}
【问题讨论】:
标签: swift dependency-injection uiviewcontroller