【问题标题】:Swift - Dependency injection in View Controller with Network calls and Storyboard?Swift - 使用网络调用和情节提要的视图控制器中的依赖注入?
【发布时间】:2018-04-01 11:40:09
【问题描述】:

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

例如,视图控制器显示一个列表。为了获取列表的数据集,应执行网络调用,然后将数据注入 dataSet 属性。

如何做到这一点?

【问题讨论】:

  • 这是YourVC类和网络类的分离吗?意味着你的VC中不会有网络类的实例成员,对吧?
  • 我可以添加一个网络类

标签: ios swift dependency-injection uiviewcontroller


【解决方案1】:

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

class DataFetcher {

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

}

在您的视图控制器中,保存对 DataFetcher 类型的引用,并通过使用静态方法实例化 ViewController 使其可注入:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-05
    • 2017-05-27
    • 2014-12-26
    • 2013-10-21
    • 2012-07-10
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多