ios - Swift - 通过网络调用和 Storyboard 在 View Controller 中进行依赖注入(inject)?

标签 ios swift dependency-injection uiviewcontroller

Swift - 如何在从 Storyboard 创建的 View Controller 中实现依赖注入(inject),并且应该注入(inject)的数据是从网络中获取的(将在异步调用后可用)?

例如,View Controller 显示一个列表。为了获取列表的数据集,应该执行网络调用,然后将数据注入(inject) dataSet 属性。

如何实现?

最佳答案

我不确定是否完全理解您的问题,但这是我通常的做法。假设您有一个 DataFetcher 类,负责进行网络调用:

class DataFetcher {

     func fetchData(completion: @escaping ([String]) -> Void) {
         // Code to fetch the data
     }

}

在你的 View Controller 中,保存对 DataFetcher 类型的引用,并通过静态方法实例化 ViewController 使其可注入(inject):

class MyViewController: UIViewController {

    private static let identifier = "MyViewController"

    var fetcher: DataFetcher?

    static func newInstance(fetcher: DataFetcher) -> MyViewController {
        let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: identifier) as! MyViewController
        controller.fetcher = fetcher
        return controller
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }

    private func fetchData() {
        fetcher?.fetchData { [weak self] data in
            // Reaload data of tableView, CollectionView, etc
        }
    }

}

然后,无论何时你想显示那个 ViewController,调用 newInstance 方法:

let fetcher = DataFetcher()
let controller = MyViewController.newInstance(fetcher: fetcher) // Injecting
present(controller, animated: true, completion: nil)

关于ios - Swift - 通过网络调用和 Storyboard 在 View Controller 中进行依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49597643/

相关文章:

ios - 当首先加载 gameScene 时可以工作,但是当被另一个场景加载时播放半秒并立即停止(没有错误),为什么?

Angular/TypeScript 将服务注入(inject)基类而不是子类

ios - 我怎样才能重新启动 SKScene?

ios - 在 iOS 13 中的图像上绘制文本

iphone - 在圆上放置按钮

c# - 打破 Liskov 替换原则的类使用陷阱

angularjs - 重新打开并向已引导的应用程序添加依赖项

ios - 修改 UIStepper 自动重复行为

ios - 升级到 Xcode 12 后构建速度极慢

swift - 如何从 CIRowAverage 过滤器中获取值?