Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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/8/python-3.x/19.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 单身人士:优点、缺点、设计问题_Ios_Cocoa_Operating System_Singleton - Fatal编程技术网

Ios 单身人士:优点、缺点、设计问题

Ios 单身人士:优点、缺点、设计问题,ios,cocoa,operating-system,singleton,Ios,Cocoa,Operating System,Singleton,我承认。我正在使用单例。我知道你们可能会说什么,坦率地说,在互联网上看到所有这些答案,谈论单身人士的坏方面,并建议反对单身人士,真的让我质疑我的编程实践 我已经在StackOverflow上读过一些关于单例的帖子,但是我发布这个问题不仅仅是为了询问它们,而且是为了了解我在程序中使用它们的方式 我觉得我必须在这里澄清一些事情并问路 因此,让我们考虑一些我使用单体的情况: 要创建全局变量的访问器,如我的根视图控制器、特定且始终存在的视图控制器、应用程序状态、全局托管对象上下文。。。诸如此类 创建其任

我承认。我正在使用单例。我知道你们可能会说什么,坦率地说,在互联网上看到所有这些答案,谈论单身人士的坏方面,并建议反对单身人士,真的让我质疑我的编程实践

我已经在StackOverflow上读过一些关于单例的帖子,但是我发布这个问题不仅仅是为了询问它们,而且是为了了解我在程序中使用它们的方式

我觉得我必须在这里澄清一些事情并问路

因此,让我们考虑一些我使用单体的情况:

  • 要创建全局变量的访问器,如我的根视图控制器、特定且始终存在的视图控制器、应用程序状态、全局托管对象上下文。。。诸如此类
  • 创建其任务是处理应用程序范围内数据的实用程序类。例如,我创建了一个单例来操作依赖于核心数据的缓存数据库。因为我需要创建缓存和其他东西以不同的视图放入数据库中,所以创建一个处理数据库输入/输出的类(注意线程安全)感觉更好
  • 处理网络会话。事实上,我用它来维持连接,并每XX秒向服务器发送PINg之类的消息
  • 我想这就是总结。我真的很想从其他开发商的意见在这个问题上

    你认为有更好的解决上述问题的方法吗

    你是否认为总是有更好的选择来取代单身,并且应该避免

    在多线程方面,忘记单线程是否更好


    任何建议和想法都是有用的,也是最受欢迎的。

    单例当然并不总是有害的,但正如您所提到的,您必须小心线程安全(在这个主题上,请查看单例初始化)

    单身人士经常被指责为邪恶的一个原因是,如果他们过于依赖单身人士及其行为,他们会使“扩展”程序部分变得更加困难。提到数据库访问,服务器或桌面应用程序可能会从单例实现开始,以处理所有数据库需求,然后尝试使用多个连接来加速独立请求等。分解此类代码可能非常困难

    即使在使用CoreData的iOS应用程序中,也可以不依赖应用程序委托或某个根视图控制器上的全局ManagedObjectContext


    如果向每个视图控制器传递对ManagedObjectContext的引用,则可以获得一些灵活性。大多数情况下,您只需将相同的上下文从一个视图控制器传递到下一个视图控制器,但如果您将来决定这样做,您可以为编辑视图创建一个新的ManagedObjectContext,在该视图中,您可以使用上下文的撤消功能,但只能将更改合并回“根”中如果用户决定保存或轻易放弃它们,则返回上下文。或者你可能想对一整套对象进行背景处理。如果所有操作都在同一个上下文中进行,那么最终会出现同步问题。

    单例当然并不总是有害的,但正如您所提到的,您必须注意线程安全(在这个主题上,请查看单例初始化)

    单身人士经常被指责为邪恶的一个原因是,如果他们过于依赖单身人士及其行为,他们会使“扩展”程序部分变得更加困难。提到数据库访问,服务器或桌面应用程序可能会从单例实现开始,以处理所有数据库需求,然后尝试使用多个连接来加速独立请求等。分解此类代码可能非常困难

    即使在使用CoreData的iOS应用程序中,也可以不依赖应用程序委托或某个根视图控制器上的全局ManagedObjectContext

    如果向每个视图控制器传递对ManagedObjectContext的引用,则可以获得一些灵活性。大多数情况下,您只需将相同的上下文从一个视图控制器传递到下一个视图控制器,但如果您将来决定这样做,您可以为编辑视图创建一个新的ManagedObjectContext,在该视图中,您可以使用上下文的撤消功能,但只能将更改合并回“根”中如果用户决定保存或轻易放弃它们,则返回上下文。或者你可能想对一整套对象进行背景处理。如果所有内容都在同一个上下文中运行,那么最终会出现同步问题

    • 要创建全局变量的访问器,如我的根视图控制器、特定且始终存在的视图控制器、应用程序状态、全局托管对象上下文。。。诸如此类
    用另一个全局文件包装一个全局文件实际上没有任何帮助

    • 创建其任务是处理应用程序范围内数据的实用程序类。例如,我创建了一个单例来操作依赖于核心数据的缓存数据库。因为我需要创建缓存和其他东西以不同的视图放入数据库中,所以创建一个处理数据库输入/输出的类(注意线程安全)感觉更好
    当然,但这可能不需要是单身。事实上,核心数据设计的一部分是,让多个MOC与同一个存储进行通信是有效的

    • 处理网络会话。事实上,我用它来维持连接,并每XX秒向服务器发送PINg之类的消息
    如果服务器可能强制执行某些n-connections-per-user/IP地址限制,则这应该是一个单例。否则,它可能不需要是单例

    正如我在之前链接的博客文章中提到的,我更喜欢的解决方案是让每个对象拥有另一个对象。例如,您的主运行中心和康涅狄格州