Ios 单身人士:优点、缺点、设计问题
我承认。我正在使用单例。我知道你们可能会说什么,坦率地说,在互联网上看到所有这些答案,谈论单身人士的坏方面,并建议反对单身人士,真的让我质疑我的编程实践 我已经在StackOverflow上读过一些关于单例的帖子,但是我发布这个问题不仅仅是为了询问它们,而且是为了了解我在程序中使用它们的方式 我觉得我必须在这里澄清一些事情并问路 因此,让我们考虑一些我使用单体的情况:Ios 单身人士:优点、缺点、设计问题,ios,cocoa,operating-system,singleton,Ios,Cocoa,Operating System,Singleton,我承认。我正在使用单例。我知道你们可能会说什么,坦率地说,在互联网上看到所有这些答案,谈论单身人士的坏方面,并建议反对单身人士,真的让我质疑我的编程实践 我已经在StackOverflow上读过一些关于单例的帖子,但是我发布这个问题不仅仅是为了询问它们,而且是为了了解我在程序中使用它们的方式 我觉得我必须在这里澄清一些事情并问路 因此,让我们考虑一些我使用单体的情况: 要创建全局变量的访问器,如我的根视图控制器、特定且始终存在的视图控制器、应用程序状态、全局托管对象上下文。。。诸如此类 创建其任
任何建议和想法都是有用的,也是最受欢迎的。单例当然并不总是有害的,但正如您所提到的,您必须小心线程安全(在这个主题上,请查看单例初始化) 单身人士经常被指责为邪恶的一个原因是,如果他们过于依赖单身人士及其行为,他们会使“扩展”程序部分变得更加困难。提到数据库访问,服务器或桌面应用程序可能会从单例实现开始,以处理所有数据库需求,然后尝试使用多个连接来加速独立请求等。分解此类代码可能非常困难 即使在使用CoreData的iOS应用程序中,也可以不依赖应用程序委托或某个根视图控制器上的全局ManagedObjectContext
如果向每个视图控制器传递对ManagedObjectContext的引用,则可以获得一些灵活性。大多数情况下,您只需将相同的上下文从一个视图控制器传递到下一个视图控制器,但如果您将来决定这样做,您可以为编辑视图创建一个新的ManagedObjectContext,在该视图中,您可以使用上下文的撤消功能,但只能将更改合并回“根”中如果用户决定保存或轻易放弃它们,则返回上下文。或者你可能想对一整套对象进行背景处理。如果所有操作都在同一个上下文中进行,那么最终会出现同步问题。单例当然并不总是有害的,但正如您所提到的,您必须注意线程安全(在这个主题上,请查看单例初始化) 单身人士经常被指责为邪恶的一个原因是,如果他们过于依赖单身人士及其行为,他们会使“扩展”程序部分变得更加困难。提到数据库访问,服务器或桌面应用程序可能会从单例实现开始,以处理所有数据库需求,然后尝试使用多个连接来加速独立请求等。分解此类代码可能非常困难 即使在使用CoreData的iOS应用程序中,也可以不依赖应用程序委托或某个根视图控制器上的全局ManagedObjectContext 如果向每个视图控制器传递对ManagedObjectContext的引用,则可以获得一些灵活性。大多数情况下,您只需将相同的上下文从一个视图控制器传递到下一个视图控制器,但如果您将来决定这样做,您可以为编辑视图创建一个新的ManagedObjectContext,在该视图中,您可以使用上下文的撤消功能,但只能将更改合并回“根”中如果用户决定保存或轻易放弃它们,则返回上下文。或者你可能想对一整套对象进行背景处理。如果所有内容都在同一个上下文中运行,那么最终会出现同步问题
- 要创建全局变量的访问器,如我的根视图控制器、特定且始终存在的视图控制器、应用程序状态、全局托管对象上下文。。。诸如此类
- 创建其任务是处理应用程序范围内数据的实用程序类。例如,我创建了一个单例来操作依赖于核心数据的缓存数据库。因为我需要创建缓存和其他东西以不同的视图放入数据库中,所以创建一个处理数据库输入/输出的类(注意线程安全)感觉更好
- 处理网络会话。事实上,我用它来维持连接,并每XX秒向服务器发送PINg之类的消息