Swift - 具有网络调用和故事板的View Controller中的依赖注入?

时间:2018-04-01 11:40:10

标签: ios swift dependency-injection uiviewcontroller

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

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

如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

我不确定是否有你的问题,但这是我通常做的。假设您有一个班级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)