代码之家  ›  专栏  ›  技术社区  ›  Alvaro

MVVM中的分析

  •  6
  • Alvaro  · 技术社区  · 7 年前

    我在我的项目中使用MVVM,此外,我在整个MVVM之外有分析服务,但我不知道在ViewModels或ViewCotrollers中在哪里调用分析服务?

    例子:

    视图模型

    login.request{ result in 
        //Here??
        Firebase.registerUser()
        viewController.finishLoginDelegate()
    }
    

    视图控制器

    func finishedLoginDelegate() {
        //Or Here??
        Firebase.registerUser()
    }
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Puneet Sharma    7 年前

    这是一个相当有趣的问题。我没有读过任何关于分析wrt MVVM的博客/文档。

    即使在遵循MVVM时,我也为在ViewController中添加了大量分析代码而感到内疚。但是,现在当我想到它时,我想为纯粹的分析相关代码包括一个分析层(如ViewModel)是明智的。我们可以称之为分析模型(AnalyticsModel)(因为没有更好的名称)。

    我们可以编写与之相关的协议,将数据和事件从ViewController/ViewModel传递到这个对象,它可以调用分析API(是我还是现在太多了),每个人都可以回到假设他们在自己的小世界里很快乐的状态。

    我编写了以下代码,以展示如何尝试编写分析模型。

    protocol LoginAnalyticsModelProtocol {
        func loginViewAppeared()
        func loginButtonPressed(user:User)
        func signUpButtonPressed()
    }
    
    
    class LoginAnalyticsModel:LoginAnalyticsModelProtocol {
        func loginViewAppeared() {
            //call analytics to send login view appeared case
        }
        func loginButtonPressed(user:User) {
            // call analytics to send login view
        }
        func signUpButtonPressed() {
            // call analytics to submit sign up button pressed event
        }
    }
    
    class LoginVC:UIViewController {
        var loginVM:LoginViewModel?
        let loginAM:LoginAnalyticsModel = LoginAnalyticsModel()
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            loginAM.loginViewAppeared()
        }
    
        @IBAction func loginButtonPressed(sender:UIButton) {
            // Get user
            // call anaytics
            loginAM.loginButtonPressed(user)
        }
    }