Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS中使用MVVM时,如何在不同部分之间进行通信_Ios_Swift_Mvvm_Viewmodel - Fatal编程技术网

在iOS中使用MVVM时,如何在不同部分之间进行通信

在iOS中使用MVVM时,如何在不同部分之间进行通信,ios,swift,mvvm,viewmodel,Ios,Swift,Mvvm,Viewmodel,我做了研究,但是因为我没有足够的经验,我不知道在使用MVVM设计模式时实现UserManger类通信的最佳方法是什么 因此,我的计时器应用程序与云同步。 到目前为止,我有HomeViewController,TimerViewModel,TimerModel,UserManager UserManager对象负责对User进行身份验证,并将身份验证状态传递给其他类 这些国家是: .notSigned、signing和signed 在这里我需要更多的解释。UserManager应该将更新的身份验证

我做了研究,但是因为我没有足够的经验,我不知道在使用MVVM设计模式时实现
UserManger
类通信的最佳方法是什么

因此,我的计时器应用程序与云同步。 到目前为止,我有
HomeViewController
TimerViewModel
TimerModel
UserManager

UserManager
对象负责对
User
进行身份验证,并将身份验证状态传递给其他类

这些国家是:
.notSigned
signing
signed

在这里我需要更多的解释。
UserManager
应该将更新的身份验证状态传递给哪个对象?它属于视图控制器还是视图模型

还有一个问题。我不知道是
UserManager
假设只与一个类通信,还是可以同时与多个对象通信。 我认为大多数对象同时需要知道用户是否签名。如果这是真的,我应该实施什么样的沟通

对于一对多,我正在考虑实现本文中描述的可观察协议。如果有必要,我可以复制代码而不是文章链接


我希望我描述得很好。我会很感激你的回答。或者任何关于如何通过应用程序建立对象通信的新见解、大局观想法。你知道这方面有什么好文章吗?

所有的业务逻辑都应该在ViewModel中。ViewModel应该是调用UserManager中任何方法的对象。UserManager应该将解析为模型的结果返回给ViewModel。然后,ViewModel需要格式化数据,并提醒ViewController事件/数据/网络完成等


格式化数据的示例:

  • 假设一个网络请求为您提供了
    firstName
    lastName
    。但是您只有一个标签来显示完整的内容。viewModel应该将这些字符串添加到一起(带有空格),并向VC提供
    fullName
    属性
  • 如果你得到了一个双精度,但需要将其格式化为货币并显示一个符号
  • 将时间戳和格式设置为日期字符串
这些是ViewModel应该做的事情。因此,它们可以独立于UI代码和生命周期进行测试


沟通:

您可以使用标准的Apple API设计并创建一个带有委托和回调的
ViewModel
协议。每个虚拟机都会确认协议,VC会将自己设置为其虚拟机的委托,并在VC的委托回调函数中运行代码


命名:

“Manager”一词已经不受欢迎,因为它通常是在类的用法不清楚时使用的默认词。因此,它有一千种不同的定义。负责发出网络请求和/或存储状态的类应称为“服务”。i、 e.“用户服务”


共享状态:

我可能会让很多人对这件事生气。但当状态需要在多个VC、组件、VM等之间共享时,我遵循Angular设置的设计模式/架构。我让我的服务班成为单身。让他们存储状态。然后,每个ViewModel对每个项目都有一个真实来源,并且可以随意设置格式

其他人使用RxSwift等框架,并使用Observable和类似技术。我个人的观点是,这是一个巨大的过度,涉及到一个巨大的学习曲线,意味着增加了大量的大型图书馆,给项目带来了很大的风险。我更喜欢坚持现有的模式,在生态系统中工作,保持简单


编辑:一对多:

它可以取决于您的用例和架构决策。我发现在我的大多数用例中都可以避免一对多的问题,方法是让单例存储状态,并让VC在每次调用
viewdideappear
时在ViewModel中触发一些东西。每次VC开业时,它都会得到最新的数据并继续进行。我提出避免一对多的原因是,在大多数情况下,屏幕上只有1个VC,并且在任何时间点运行代码(使用ChildViewController是例外)。我发现有可能完全回避这个问题,通过改变我与数据的交互方式而不是改变苹果API的结构来保持应用程序的简单

现在,根据您的用例,如果您有多个计时器和大量屏幕切换,这可能不起作用,可能会错过一个事件

NotificationCenter不是我最喜欢的方法,但如果我遇到无法避免的一对多情况,我会尝试一下。正如文章中提到的,您可以通过这种方式访问swift功能,这有一些缺点。它至少还有一个额外的好处,那就是它已经存在了很长一段时间,并且被很好地理解,不太可能改变太多。如果其他开发者也在开发这个应用程序,就不会有太大的学习曲线

文章中提到的另一种方法很有趣,即构建自己的精简版RxSwift,以便在项目中添加观察者。RxSwift目前的问题是,人们不将它与单例或某种控制中心点结合使用。当你在物体A上有一个可观测的,由B观测的,还有另一个可观测的,由C观测的,它调用一个由E,F和G观测的D上的函数。。。。等等这种风格的代码令人难以置信地混乱,难以阅读,容易出错,而且很难理解