MVVM 中的分析

Alv*_*aro 6 analytics mvvm ios swift

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

例子:

查看模型

login.request{ result in 
    //Here??
    Firebase.registerUser()
    viewController.finishLoginDelegate()
}
Run Code Online (Sandbox Code Playgroud)

查看控制器

func finishedLoginDelegate() {
    //Or Here??
    Firebase.registerUser()
}
Run Code Online (Sandbox Code Playgroud)

Pun*_*rma 5

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

在 Analytics 中,在某些情况下,需要为视图生命周期的不同阶段发送事件,而在某些情况下,只有数据很重要。再加上项目经理需要大多数分析并且他们通常不将它们包含在规范中,因此在考虑应用程序或功能的架构时很难将它们考虑在内。

即使在遵循 MVVM 的情况下,我也对在 ViewControllers 中放置了大量分析代码感到内疚。但是,现在当我想到它时,我想为纯粹的分析相关代码包含一个分析层(如 ViewModel)是明智的。我们可以称之为 AnalyticsModel(因为没有更好的名字)。

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

我编写了以下代码,以展示如何尝试编写 AnalyticsModel。

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)
    }
}
Run Code Online (Sandbox Code Playgroud)