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
Swift 如何应用结构对视图控制器操作的数据进行建模_Swift_Cocoa_Cocoa Touch_Model View Controller_Struct - Fatal编程技术网

Swift 如何应用结构对视图控制器操作的数据进行建模

Swift 如何应用结构对视图控制器操作的数据进行建模,swift,cocoa,cocoa-touch,model-view-controller,struct,Swift,Cocoa,Cocoa Touch,Model View Controller,Struct,我试图在我的应用程序设计中更多地采用Swift的值类型,但我在初学者中遇到了一些困难。我知道这些在StackOverflow格式中通常不适合作为基于意见的格式,但我认为这里有一些最佳实践可能不是特别主观 我理解structs的所有理论好处,关于避免共享可变状态,复制行为使实现“撤销”变得容易,等等,但我很难在实践中为我的应用程序的模型层使用它(我认为structs将是最有益的)。我甚至不知道这是否值得追求,所以请容忍我 假设我有一个集合视图,它的条目为图片及其元数据建模。选择图片后,它将显示一个

我试图在我的应用程序设计中更多地采用Swift的值类型,但我在初学者中遇到了一些困难。我知道这些在StackOverflow格式中通常不适合作为基于意见的格式,但我认为这里有一些最佳实践可能不是特别主观

我理解structs的所有理论好处,关于避免共享可变状态,复制行为使实现“撤销”变得容易,等等,但我很难在实践中为我的应用程序的模型层使用它(我认为structs将是最有益的)。我甚至不知道这是否值得追求,所以请容忍我

假设我有一个集合视图,它的条目为图片及其元数据建模。选择图片后,它将显示一个详细视图,您可以查看和编辑图片及其关联元数据(文件名、gps位置、说明、标记等)的详细信息

我正在努力设计细节视图控制器和存储所有图像的存储库的模型层之间的交互

以下是我关于如何设计视图层和模型层之间的交互的一些想法

  • 视图控制器可以对模型层拥有的模型进行别名。也就是说,模型层将保存模型对象的集合。选择一个对象后,VC将向模型层询问其中一个对象,该对象将通过引用返回。当用户更改图像的详细信息时,VC的别名引用将用于访问“活动”模型对象,并直接更新它

    这听起来是最简单的方法,可能是我在其他语言(如Java)中所做的,但它迫使我使用
    来建模对象,否则
    结构
    似乎更合适。在这种情况下,(对我来说)似乎不需要身份。如果两个图片对象具有相同的字段,则它们无法区分

  • 如果我试图将模型保持为结构,我的视图控制器可以使用复制-修改-写入模式

    • 选择要编辑的图像时,其模型将复制到VC中
    • VC对其本地副本进行操作,对其进行适当的变异
    • 最终,当更改需要持久化时(例如切换到新图像进行编辑、退出应用程序等),VC将用其本地副本覆盖模型层的值
    这消除了方法1中共享可变状态可能带来的任何潜在线程问题,但也带来了模型从VC中去同步的缺点,这可能会导致各种一致性问题

  • 接下来的3种方法考虑使用类似于联合或RX的反应框架的想法。我可以使用此模式订阅我的VC,以接收模型层及其
    图片
    对象中更改的更新。然而,我不确定“另一种方式”将如何运作;VC将如何通知模型进行更新。如果我让模型订阅视图,那么我想我会有一个无限循环,除非我添加了一些机制,围绕这些机制,哪些变化应该触发观察者,哪些不应该


    我不确定哪一个是最好的,我怀疑这是你从经验中学到的东西之一(我还没有:p)。任何指导都将不胜感激

    对于是否应该使用引用类型的值这一问题,并没有做出真正的反应,但有一个更一般的建议:VC根本不应该改变模型。VC应该只处理UI,业务逻辑(在您的特定情况下,处理模型的实际编辑)应该由另一个实体处理(确切的实体取决于您使用的架构)。如果让视图控制器处理模型的变化,从而通过同一实体处理UI和业务逻辑,那么最终将得到大规模的视图控制器体系结构。关注点分离。@DávidPászor公平点,但这并不能完全解决问题。假设VC没有直接改变图像对象(不管它们是类还是结构的实例),而是要求模型层对象(
    ImageRepository
    ,或其他什么)代表它编辑它们。image repo如何知道在VC调用其方法时编辑哪个图像?正如我在评论的开头所说的,这并不是你的具体问题,而是一条无关的一般性建议。至于第二个问题:如果VC可以访问模型对象的集合,则该集合必须通过某个值(可以是
    数组
    字典
    或其他自定义集合)进行索引。VC应该将所选图像的索引传递给模型层,然后模型层访问指定的模型并对其进行变异,而不直接向VC公开可变模型。@DávidPásztor Ahhh,是的,这是我以前想到的一个变体,我没有将其列为我的想法之一。我拒绝了这种方法,因为我看不到任何好处。键/索引的行为就像一个不必要的间接层,根本没有真正解耦。在模型repo上调用api与直接在模型对象上调用api没有什么不同。考虑<代码>自我.IVENEARPO。SET(位置:LOC,FIMANEMEND:一些IMAIDENAMEY)< /COD> VS >代码> SELF.IIGIONET= LOC 。主要的好处是,在第一种情况下,你称之为间接的间接层,模型回购可以做一些验证,额外的计算,在后一种情况下,VC可以直接设置模型的属性,而无需在setter之前进行任何验证或运行任何逻辑(当然,除非您为需要此类验证的属性创建自定义setter)