Лучшая практика при совместном использовании данных / моделей между вкладками TabBarController в Swift

#ios #swift

#iOS #swift

Вопрос:

Я создал TabBarController файл, в котором я хотел бы обмениваться данными между вкладками. Каждая вкладка имеет свой собственный контроллер. Я прочитал о многих способах достижения этого в iOS и Swift. Читая онлайн, я прочитал о недостатках Singleton шаблона, таких как глобальная изменчивость и сниженная тестируемость, и решил не использовать этот шаблон. Я решил использовать dependency injection шаблон.

Мне было интересно, правильно ли я использую этот шаблон в Swift или я нарушаю принципы разработки iOS. Как новый разработчик iOS, я хотел бы услышать ответы о том, правильно я поступаю или неправильно.

Вот мой TabBarController класс:

 class ExampleTabsController: UITabBarController {

var exampleModel: ExampleModel = ExampleModel()

override func viewDidLoad() {
    super.viewDidLoad()

    loadViewControllers()
}

func loadViewControllers() {
    //initialize the storyboards with their respective controllers
    let firstViewController = UIStoryboard(name: "First", bundle:nil).instantiateViewController(identifier: "FirstView") as! FirstController
    let SecondViewController = UIStoryboard(name: "Second", bundle:nil).instantiateViewController(identifier: "SecondView") as! SecondController
    
    //create the tab bar items for each view controller
    firstViewController.tabBarItem = UITabBarItem(tabBarSystemItem: .more, tag: 0)
    secondViewController.tabBarItem = UITabBarItem(tabBarSystemItem: .more, tag: 1)
    
    //create a list of all the controllers that will be loaded into the tab bar
    let tabBarList = [firstViewController, secondiewController]
    
    //load the tab bar
    viewControllers = tabBarList
}
  

И вот как мои Controllers кодируются.

 class FirstController: UIViewController {

@IBOutlet weak var list: UILabel!

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

override func viewWillAppear(_ animated: Bool) {
    let tabBar = tabBarController as! ExampleTabsController
    
    list.text = String(describing:tabBar.exampleModel.exampleList)
}

}
  

Теперь все это работает нормально, и я могу отображать данные в виде меток на Views вкладках, но мне было интересно, будет ли это считаться плохой практикой разработки iOS. В Интернете есть много статей с множеством разных способов, и это показалось хорошим способом без использования Singleton шаблона со всеми его недостатками. Мне было интересно, правильно ли используется мой пример dependency injection ? Любая помощь приветствуется, спасибо!!

Ответ №1:

 let tabBar = tabBarController as! ExampleTabsController
  

Но что, если TabBarController вашего ExampleViewController будет другим UITabBarController или nil? Ваша архитектура перестанет работать.
Ваш ExampleTabsController и FirstController связаны очень жестко.
Я могу предложить вам небольшое исправление:

Добавьте ссылку на вашу модель внутри FirstViewController:

 var model: ExampleModel?
  

Введите его в функцию loadViewControllers () вашего ExampleTabsController:

 firstViewController.model = self.exampleModel
  

Теперь ваш ExampleTabsController и FirstViewController не связаны.

Комментарии:

1. Это здорово и дает мне лучшее представление о внедрении зависимостей с помощью Swift! Просто вопрос, допустим, я хочу, чтобы эта модель была разделена между разными вкладками. Могу ли я назначить эту модель из TabBarController во все его представления вкладок, и поскольку она имеет ссылочный тип (это класс), все они будут использовать одну и ту же модель и, следовательно, смогут изменять и обмениваться данными между вкладками?

2. Да, они будут.