Очистка хранилища данных и маршрутизации Swift

#ios #swift #clean-architecture

#iOS #swift #чистая архитектура

Вопрос:

Я разрабатываю приложение в чистой архитектуре, я хочу передавать данные на главный экран после входа пользователя в систему, вот мой файл маршрутизатора:

 import UIKit

protocol LoginRoutingLogic: class {
    func routeToRegisterController()
    func routeToRecoveryPassword()
    func routeToMainPage()
    
}

protocol LoginDataPassing: class {
    var dataStore: LoginDataStore? { get }
}

final class LoginRouter: LoginRoutingLogic, LoginDataPassing {
    
    weak var viewController: LoginController?
    var dataStore: LoginDataStore?
    
    func routeToRegisterController() {
        let storyboard = UIStoryboard(name: Constants.Identifiers.registerControllerIdentifier, bundle: nil)
        
        if let viewcontroller = storyboard.instantiateViewController(withIdentifier: Constants.Identifiers.registerControllerIdentifier) as? RegisterController {
            viewController?.navigationController?.pushViewController(viewcontroller, animated: true)
        }
    }
    
    func routeToRecoveryPassword() {
        let storyboard = UIStoryboard(name: Constants.Identifiers.forgotPasswordControllerIdentifier, bundle: nil)
        
        if let viewcontroller = storyboard.instantiateViewController(withIdentifier: Constants.Identifiers.forgotPasswordControllerIdentifier) as? RecoveryPasswordController {
            viewController?.present(viewcontroller, animated: true, completion: nil)
        
        }
    }
    
    func routeToMainPage() {
        let storyboard = UIStoryboard(name: "MainPageController", bundle: nil)
        
        if let viewcontroller = storyboard.instantiateViewController(withIdentifier: "MainPageController") as? MainPageController {
            
            viewController?.navigationController?.pushViewController(viewcontroller, animated: true)
        }
    }    
}

 

моя пользовательская модель, в которой я хочу передать значения на главную страницу, делает вызов просто отличным:

 import Foundation

struct User: Codable {
    var token: String?
    var name: String?
    var email: String?
    var password: String?
    var statusCode: Int?
}

struct LoginError: Codable {
    
}

extension User {
    static func parse(responseData: Data?) -> User? {
        var user: User?
        guard let data = responseData else {
            return user
        }
        
        do {
            let decoder = JSONDecoder()
            user = try decoder.decode(User.self, from: data)
        } catch let err {
            print("Error: ", err)
        }
        return user
    }
}
 

и ViewController, которому я хочу передать имя пользователя на метку имени пользователя:

 import UIKit

protocol MainPageDisplayLogic: class {
    func getData(viewModel: LoginModel.Fetch.ViewModel)
}

final class MainPageController: UIViewController {
    
    var interactor: MainPageBusinessLogic?
    var router: (MainPageRoutingLogic amp; MainPageDataPassing)?
    var builder = MainPageBuilder()
    
    // MARK: Object lifecycle
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setUpView()
    }
    
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        setup()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }
    
    // MARK: Setup
    
    private func setup() {
        let viewController = self
        let interactor = MainPageInteractor()
        let presenter = MainPagePresenter()
        let worker = MainPageWorker()
        let router = MainPageRouter()
        viewController.interactor = interactor
        viewController.router = router
        interactor.presenter = presenter
        interactor.worker = worker
        presenter.viewController = viewController
        router.viewController = viewController
        router.dataStore = interactor
    }
}

extension MainPageController: MainPageDisplayLogic {
    
    func getData(viewModel: LoginModel.Fetch.ViewModel) {
        let name = viewModel.name
        builder.usernameLabel.text = name
    }

}

extension MainPageController: ViewCodeProtocol {
    func setUpView() {
        viewHierarchy()
        makeConstraits()
        setupViewNavigationBar()

    }
    
    func viewHierarchy() {
        view.addSubview(builder.usernameLabel)
    }
    
    func makeConstraits() {
        builder.usernameLabelConstraits()
    }
    
    func setupViewNavigationBar() {
        navigationController?.setNavigationBarHidden(false, animated: true)
    }
}
 

И маршрутизатор с главной страницы, я еще не мог правильно понять, что такое хранилище данных, как передавать данные между контроллерами в чистом swift? по крайней мере, без ошибок пользователя.

 import Foundation

protocol MainPageRoutingLogic: class {
    
}

protocol MainPageDataPassing: class {
    var dataStore: MainPageDataStore? { get }
    
}

final class MainPageRouter: MainPageRoutingLogic, MainPageDataPassing {
    
    weak var viewController: MainPageController?
    var dataStore: MainPageDataStore?
    
}
 

Ответ №1:

Я понял это, мне просто нужно использовать ссылки на хранилища данных в целевом ViewController и извлекать данные.

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

1. И как вы передаете эту ссылку? (У меня просто тот же вопрос по теме)

2. как получить данные из хранилища данных целевого VC?