Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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-将累积的数据沿UIViewController的长链传递_Ios_Uiviewcontroller_Singleton - Fatal编程技术网

iOS-将累积的数据沿UIViewController的长链传递

iOS-将累积的数据沿UIViewController的长链传递,ios,uiviewcontroller,singleton,Ios,Uiviewcontroller,Singleton,我正在编写一个iOS应用程序,其中包含几个(可能8个)调查风格的模块,用户将在其中回答一系列问题(关于家庭生活、健康等)。有些模块有多达12个问题。每个问题都有自己的nib和UIViewController。答案将被写入数据库,理想情况下,在模块结束时。每个模块对应一个表中的一条记录。只有一个用户,因此只有一条记录。我想将核心数据堆栈保留在应用程序委托中。我目前正在从视图控制器创建核心数据对象 我一直在努力寻找: 通过UIViewController的长线性链传递累积数据的最佳方法 另一种解决办

我正在编写一个iOS应用程序,其中包含几个(可能8个)调查风格的模块,用户将在其中回答一系列问题(关于家庭生活、健康等)。有些模块有多达12个问题。每个问题都有自己的nib和UIViewController。答案将被写入数据库,理想情况下,在模块结束时。每个模块对应一个表中的一条记录。只有一个用户,因此只有一条记录。我想将核心数据堆栈保留在应用程序委托中。我目前正在从视图控制器创建核心数据对象

我一直在努力寻找:

  • 通过UIViewController的长线性链传递累积数据的最佳方法
  • 另一种解决办法
  • 我意识到以下可能性:

    • 使用每次传递时添加到的集合,通过视图控制器的重载初始值设定项向下传递数据链
    • 再次使用集合将数据传递给子视图控制器中的属性
    • 在App委托中使用全局变量(我不认真考虑这个选项)
    • 使用单例类
    我认为在这种情况下,单例被认为是最好的选择,至少在设计方面是这样,但到目前为止,我的研究还没有听说有人使用这么多(8个,也许更多)单例。他们挑起这么多争论的事实使我困惑。我有时会看到多线程和单线程一起讨论,但我不理解为什么它们会携手并进(如果它们真的这样做的话),以及我将如何处理它们。最后,如果我使用单例,我会从单例还是从视图控制器调用核心堆栈

    编辑:如果我使用单例,另一个问题是-我如何处理我的核心数据实体类?我可以或者应该使用singleton类来替换它们吗


    如能回答上述问题和/或备选解决方案建议,将不胜感激。如果可能的话,我想在良好的设计和简单/快速的实现之间找到一个折衷方案。更改应用程序设计不是一个选项(客户机决定布局和流程)。

    作为一名工程师,我曾参与过许多iOS项目,我尝试过您刚才提到的所有方法。到目前为止,最干净、最可维护的解决方案是使用单例

    为什么??从重构的角度考虑代码。您有一个在不同视图控制器中重复多次的过程(将类型为answer的对象推送到核心数据堆栈)。如果你不喜欢答案处理代码中的处理方式,那么你需要对该代码的相关部分进行更改,无论它在你的应用程序中出现过什么。一个视图控制器一个视图控制器地进行适当的更改比在一个地方进行更改要繁琐得多。这似乎显而易见,但在设计任何应用程序时,这都是一个深刻的事实

    让我们考虑在视图控制器中传递一个累加对象。无论是通过属性还是通过为视图控制器子类创建新的指定初始值设定项来执行此操作,都需要编写样板代码,以便将对象从一个视图控制器传递到下一个视图控制器。鉴于您所描述的每个问题都有其自己的UIViewController子类,这意味着您将在每一步都受到类型安全性的支配,只是为了移动数据。如果您决定明天更改正在传递的数据类型,该怎么办?即使您有一个特殊的UIViewController子类,该子类集中了所有其他控制器继承的样板代码,但仍然存在相同的问题,即在代码中散布随机赋值,只是为了将数据保留在那里。您还可能需要处理用户返回重新回答问题的情况,这需要更多的分配/指定初始化

    现在考虑一个单身汉。singleton非常棒,因为它可以拥有和管理最好的一组单一数据,同时还可以让应用程序的任何部分都可以访问它。想象一个单身汉,就像你想象的那样。您只需要处理一个UIDevice——类似地,您只需要处理一个核心数据堆栈或一组数据。为什么不认识到这一点,并尝试从中考虑您的代码

    不幸的是,苹果在故事板中的例子让人觉得,思想依赖注入是将数据从一个视图控制器传递到下一个视图控制器的唯一方式。不要试图思考其他工程师对某些实践的看法,而是尝试确定您自己使用的每种方法的优缺点。如果你不完全理解它们,试试看结果如何。其中很多都是反复试验,建筑设计也不例外

    编辑正如Inafziger所说,在多线程上存储(在某些情况下读取)数据时,单线程非常棘手。如果您是从多个线程向singleton写入数据,请构建任意类型和大小的调度队列,并在单独的线程上运行(或将其添加到主线程上的运行循环)。如果您不处理多个线程,那么单线程非常棒:)


    顺便说一句,您可以在Objective C中找到创建单身人士的最佳实践。

    感谢您提供了如此详细和雄辩的答案。您或任何人,解决我对多线程业务的困惑,以及我是否可以或应该将更新/保存放在单例中?单例和线程的问题只有在使用多个线程访问单例时才会出现。你是吗?如果没有,那你就不用担心了。很高兴能帮助cmac。如果你还有其他问题,请告诉我。