Cha*_*les 3 c++ queue port grand-central-dispatch swift
我正在将一些代码从C++移植到使用Grand Central Dispatch的Swift,我发现一个奇怪的错误,dispatch_queue_create看起来根本不起作用.
例如,在我的C++基类头中,我会声明
dispatch_queue_t m_WorkQ;
Run Code Online (Sandbox Code Playgroud)
并在初始化器中,放
m_ResultQ = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0);
Run Code Online (Sandbox Code Playgroud)
......一切都很光荣.
我在Swift中尝试过这个,在我的课堂上,在课堂上声明这个:
var resultQueue: dispatch_queue_t
Run Code Online (Sandbox Code Playgroud)
......在初始化者中,我有(除其他外)这条线
resultQueue = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0)
Run Code Online (Sandbox Code Playgroud)
...它编译并启动正常,但在上面的行上给我一个EXC_BAD_ACCESS(代码= 1,地址= 0x37)的立即运行时错误
为了确定它是否是我做过的任何其他事情,我创建了一个仅包含以下代码的命令行工具应用程序:
import Foundation
var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", 0)
println(thisQueue.description)
Run Code Online (Sandbox Code Playgroud)
......果然,我在"thisQueue"分配线上得到了上述错误.所以我非常确定有一些关于Swift和GCD队列创建非常明显的东西,我很遗憾.
有人可以帮帮我吗?
第二个参数dispatch_queue_create()有类型
dispatch_queue_attr_t,声明为
typealias dispatch_queue_attr_t = NSObject
Run Code Online (Sandbox Code Playgroud)
您必须传递DISPATCH_QUEUE_SERIAL或nil为串行队列(或DISPATCH_QUEUE_CONCURRENT并发队列):
var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", DISPATCH_QUEUE_SERIAL)
Run Code Online (Sandbox Code Playgroud)
在C(++)中,0可以传递而不是NULL指针.
但是,Swift编译器将整数包装0到一个NSNumber对象中,以便可以将它传递给期望NSObject
参数的函数.这会导致运行时异常,因为NSNumber它不是有效的属性.所以在Swift中传递0或nil显着不同.