如果在GCD中为队列创建相同的名称,它是否是相同的队列?

时间:2015-11-10 02:00:45

标签: ios swift grand-central-dispatch

Q1:如果在GCD中为队列创建相同的名称,它是否是相同的队列?

class Sample {
private var time:Int64 = 0
func asyncSerial(time:Int64){
    let queue = dispatch_queue_create("test",DISPATCH_QUEUE_SERIAL)

    dispatch_async(queue){
        let delayTime = dispatch_time(DISPATCH_TIME_NOW, time)
        self.time = time
        print("async:\(self.time)")

        dispatch_after(delayTime, queue){
            print("wait:\(self.time)")

        }
    }

    print("sync:\(self.time)")
}
}

let s = Sample()
s.result(10)
let s2 = Sample()
s1.result(1)

我在游乐场(Xcode 7.1)中运行它,结果:

同步:100异步:100同步:0异步:1等待:100等待:1

我瘦的结果应该是:

同步:100同步:0异步:100异步:1等待:100等待:1

1 个答案:

答案 0 :(得分:6)

label仅用于记录和调试目的。对于documentation

  

附加到队列的字符串标签,用于唯一标识它   调试工具,如Instruments,sample,stackshots和crash   报告。因为应用程序,库和框架都可以   创建自己的调度队列,反向DNS命名样式   (com.example.myqueue)是推荐的。此参数是可选的   可以是NULL。

每次调用dispatch_queue_create函数时,您都在创建一个新队列。函数退出并且最后一个块已完成执行后将释放此队列,因为您只在本地变量中保存引用。

获得变量输出的原因是两个代码块可以并发执行,并且都更新self.time属性。有时第一次打印在第二次调用将属性设置为1之前执行(因此得到“10,1”),有时在第一次打印执行之前属性已经设置为1,因此得到“1,1”。