注意:在这种情况下,我是not using it for a singleton;我想运行任意代码一次.
更新:我主要感兴趣的是在实例方法中使用这个方法时推荐的惯例,但是在类方法,函数和全局上下文中的使用对于完整性来说将是有用的.
/*! * @typedef dispatch_once_t * * @abstract * A predicate for use with dispatch_once(). It must be initialized to zero. * Note: static and global variables default to zero. */ typealias dispatch_once_t = Int
这里是dispatch_once文档的引用:
The predicate must point to a variable stored in global or static
scope. The result of using a predicate with automatic or dynamic
storage (including Objective-C instance variables) is undefined.
令牌变量必须存储在全局/静态范围中,并且必须初始化为零,这将导致以下代码:
import Foundation var token: dispatch_once_t = 0 dispatch_once(&token) { () -> Void in print("Called once") }
如果您省略= 0(令牌初始化),则它不起作用,因为编译器在初始化之前会产生变量’token’的错误地址,尽管静态和全局变量默认为零.测试在Xcode 7B2.
基于评论的更多例子.如果你在课堂里有几种可能性.
您无法在方法内声明静态属性,否则编译器生成静态属性只能在类型错误上声明.这不行:
class func doItOnce() { static var token: dispatch_once_t = 0 ... }
必须在类型上声明.这是在Swift 1.2(Xcode 6.3 IIRC)中引入的.
“static” methods and properties are now allowed in classes (as an
alias for “class final”). You are now allowed to declare static stored
properties in classes,which have global storage and are lazily
initialized on first access (like global variables). Protocols now
declare type requirements as “static” requirements instead of
declaring them as “class” requirements. (17198298)
那么,如果我们不喜欢全球变数,我们可以做些什么?
类型上的静态变量
class MyClass { private static var token: dispatch_once_t = 0 class func doItOnce() { dispatch_once(&token) { print("Do it once") } } }
静态在一个包裹在struct中的方法
不喜欢yur类的静态属性?想用你的方法吗?将它包装成如下结构:
class func doItOnce() { struct Tokens { static var token: dispatch_once_t = 0 } dispatch_once(&Tokens.token) { print("Do it once") } }
其实我不知道任何苹果推荐,最佳实践,…如何做到dispatch_once.只需使用你最喜欢的任何东西,对你感觉很好,只要符合全局/静态范围.