好的,所以我在Xcode 8中找到了新的SwiftyDispatchAPI。我在使用中很有趣DispatchQueue.main.async
,并且我一直Dispatch
在Xcode中的模块周围浏览以找到所有新的API。
但是我也要dispatch_once
确保单例创建和一次性设置之类的操作不会被执行多次(即使在多线程环境中也是如此)…并且dispatch_once
在新的Dispatch模块中找不到任何地方吗?
static var token: dispatch_once_t = 0
func whatDoYouHear() {
print("All of this has happened before, and all of it will happen again.")
dispatch_once(&token) {
print("Except this part.")
}
}
从Swift 1.x开始,Swift一直dispatch_once
在幕后使用全局变量和静态属性执行线程安全的延迟初始化。
因此,static var
上面的代码已经被使用了dispatch_once
,这使其变得很奇怪(再次使用它作为另一个对象的令牌可能会产生问题dispatch_once
。实际上,dispatch_once
如果没有这种递归,实际上是没有安全的方法可以使用的,因此他们放弃了。)
,只需使用基于其构建的语言功能:
// global constant: SomeClass initializer gets called lazily, only on first use
let foo = SomeClass()
// global var, same thing happens here
// even though the "initializer" is an immediately invoked closure
var bar: SomeClass = {
let b = SomeClass()
b.someProperty = "whatever"
b.doSomeStuff()
return b
}()
// ditto for static properties in classes/structures/enums
class MyClass {
static let singleton = MyClass()
init() {
print("foo")
}
}
因此,如果您一直使用dispatch_once
一次 初始化 来产生某个值,那就太好了-您可以将该值设为要初始化的全局变量或静态属性。
但是,如果您dispatch_once
用来做不一定会产生结果的工作该怎么办?您仍然可以使用全局变量或静态属性来执行此操作:只需将变量的类型设为Void
:
let justAOneTimeThing: () = {
print("Not coming back here.")
}()
而且,如果访问全局变量或静态属性来执行一次性工作对您来说并不适合-例如,您希望客户在使用库之前调用“初始化我”功能-只需包装一下访问功能:
func doTheOneTimeThing() {
justAOneTimeThing
}
有关更多信息,请参见迁移指南。
问题内容: 我想在我的JavaScript代码中包含几个JSON文件,这些文件与JavaScript源文件位于同一目录中。 如果我想包含另一个JavaScript文件,可以直接使用。现在,我正在使用和获取JSON,我认为这是执行此操作的丑陋方法。 是否有类似的要求,使我能够加载JSON文件? 问题答案: 从节点v0.5.x开始,是的,您可以像需要js文件一样要求JSON。 在ES6中:
问题内容: 如果我忘记了,有时反正还是可行。但有时并非如此。 在JDBC和Android SQLite中,似乎根本不需要。我很迷惑。 我什么时候应该使用分号? 问题答案: 分号表示一条语句的结尾,因此,如果有多个语句,则应使用分号,否则它将正常工作。 我通常使用分号作为练习,即使您在sql客户端上运行查询,例如在Sql Developer中使用分号,如果在工作表上有多个语句,它也很有用,因为您可以
随着新的工具栏小部件的引入和AppCompat(android.support.v7.widget.Toolbar)版本的推出,是否还需要调用setSupportActionbar(工具栏)?或者调用setSupportActionbar有什么好处吗;现在我们可以设置标题、子标题、导航图标、导航图标单击侦听器(getSupportActionBar()。直接在工具栏上设置DisplayHomeAs
问题内容: AFAIK,您无需在onclick中指定协议: 坏 好 今天,我在GoogleAnallytics上注意到他们正在使用它: 这个例子是完全错误的,还是有理由指定除?以外的其他内容? 问题答案: 这里的一些响应声称“javascript:”前缀是“过去的遗留物”,这意味着浏览器有意对它进行了特殊处理,以实现向后兼容。是否有确凿的证据证明是这种情况(有人检查过源代码)吗? 对我来说,它的意
问题内容: 众所周知,Windows使用带反斜杠的路径,而Unix使用带反斜杠的路径。node.js提供了始终使用正确的斜杠。因此,例如,您不必编写Unix,而只编写Unix 。 但是,似乎存在这种差异,但是如果您不对路径进行规范化(例如,使用path.join),而仅编写诸如node.js之类的路径,则在Windows上运行脚本没有问题。 那么,有没有写上任何好处了?无论平台如何,两者似乎都可以
本文向大家介绍什么是<!DOCTYPE >?是否需要在HTML5中使用?相关面试题,主要包含被问及什么是<!DOCTYPE >?是否需要在HTML5中使用?时的应答技巧和注意事项,需要的朋友参考一下 <!DOCTYPE>是关于页面写入了什么版本的HTML的指令。<!DOCTYPE>标记没有结束标记,它不区分大小写。 <!DOCTYPE>声明必须是HTML5文档中的第一行,在标记之前。如HTML 4