- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我理解 dispatch_once
是一个等同于 static
变量的东西,并且 dispatch_once
中的代码片段在整个过程中只执行一次应用程序。
我正在浏览一个庞大的代码库并遇到了这样的事情
+ (DBHelper *)sharedInstance {
static DBHelper *sharedDBHelper = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedDBHelper = [[super alloc] initUniqueInstance];
});
return sharedDBHelper;
}
DBHelper.sharedInstance 用于获取一个对象,在很多地方都会用到生成对象。
我对为什么在这里使用 dispatch_once 感到困惑,因为那意味着您只能拥有该类的一个对象?
最佳答案
这是共享实例的标准模式,也称为假单例。
在许多情况下,程序员选择使用可以从应用程序的任何部分轻松访问的单个对象 - 通过调用返回对共享对象的引用的静态方法,即 sharedInstance
您的示例 - 作为在应用程序的其他独立部分之间提供通信/共享数据的手段。
这是一个faux 单例模式,因为它不会阻止创建相同类型的其他实例(在您的示例中为 DBHelper
)。 真正的单例模型是一种只能创建该类型的单个实例的模型。 (Apple 曾经有示例代码展示如何创建真正的单例,但它从未针对后 ARC 世界进行更新,有关包括 ARC 版本在内的更多详细信息,请参阅 this answer。)
HTH
关于ios - dispatch_once 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44828652/
在我将项目转换为 ARC 后, dispatch_once 调用导致崩溃(在模拟器中)。 我最初的问题是,我的一个单例对象的 + (SingletonClass)shared { ...dispatc
我一直在为共享实例使用 dispatch_once,但我不明白 dispatch_once 是如何工作的,为什么它只运行一次。 最佳答案 低级计算答案。 尝试访问临界区的不同线程——传递给 dispa
我理解 dispatch_once 是一个等同于 static 变量的东西,并且 dispatch_once 中的代码片段在整个过程中只执行一次应用程序。 我正在浏览一个庞大的代码库并遇到了这样的事情
我尝试使用dispatch_once,但是我得到了这种错误 var onceToken : dispatch_once_t = 0 dispatch_once(&onceToken, { ()
我目前正在为我的应用程序编写一个帮助程序类。助手类将返回全局可访问的变量。我创建了一个简单的助手,如下所示: @interface MyHelper : NSObject { } +(id) shar
由于应用程序的启动生命周期,我只想询问一次用户的位置。我的意思是,每次用户启动应用程序时,请求他的位置服务(仅一次)。 我想用 dispatch_once 来做到这一点。 static dispatc
哪个更好? static unsigned unitFlags; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{
我有一堆动画包含在大约 10 个纹理图集中。我正在处理的项目中有一群坏人到处跑,所以显然我不应该在每次实例化坏人类时都复制所有动画。 我应该使用(选项 A)单例类来存储我所有的坏人动画,并让它在需要时
有没有更短的版本?感觉像很多样板。 我举了几个我认为很乏味的例子 + (instancetype)sharedInstance { static dispatch_once_t onceTok
我的项目使用ARC 我有 1 个这样的类: @implementation MyObject + (instancetype)shareInstance { static id _shareI
+(Service *) sharedInstance { static LocationService *instance = nil; static dispatch_once_t
如何使用 dispatch_once, 让给定的代码在每个实例生命周期内执行一次。 等同于在对象内部拥有一个属性,并像这样使用它: - (void)viewWillAppear:(..).. {
为什么我会陷入僵局? - (void)foo { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{
来自Swift guide : If a property marked with the lazy modifier is accessed by multiple threads simultan
我有以下代码: static NSDictionary * errorDescriptions = nil; + (NSString *) errorsFromCode: (WPErrorCode
在 NSHipter 关于 method swizzling 的文章中,它说“Swizzling 应该总是在 dispatch_once 中完成。”为什么这是必要的,因为 +load 每个类只发生一次
在处理 Apple 的按需资源框架时,我的应用程序发现为一部分用户生成了许多异常。我解决此问题的第一次尝试是将我的代码包装在 @try/@catch block 中,但不幸的是,崩溃仍然传播。我已经缩
我需要将以下 Objective-C 代码转换为 Swift。 static RWBasicCell *sizingCell = nil; static dispatch_once_t onceTok
dispatch_once + (NSArray *)titles { static NSArray *_titles; static dispatch_once_t onceToke
假设有一些事情我想确保它在执行时永远不会被调用。 以 UIScrollView 为例,每次发生任何缩放时都会调用 scrollViewDidScroll: 方法。如果我想在第一次调用时使用 [UIVi
我是一名优秀的程序员,十分优秀!