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

Is it the same queue if create the same name for queue in GCD?

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 async:100 sync:0 async:1 wait:100 wait:1

我认为结果应该是:

同步:100 sync:0 async:100 async:1 wait:100 wait:1

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

A string label to attach to the queue to uniquely identify it in debugging tools such as Instruments, sample, stackshots, and crash reports. Because applications, libraries, and frameworks can all create their own dispatch queues, a reverse-DNS naming style (com.example.myqueue) is recommended. This parameter is optional and can be NULL.

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

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