如何使用 GCD 创建串行队列

How to make a serial queue with GCD

我试着用 GCD 为网络操作创建一个串行队列,如下所示:

let mySerialQueue = dispatch_queue_create("com.myApp.mySerialQueue", dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, 0))


func myFunc() {
    dispatch_async(mySerialQueue) {

        do {
            // Get object from the database if it exists
            let query = PFQuery(className: aClass)
            query.whereKey(user, equalTo: currentUser)
            let result = try? query.getFirstObject()

            // Use existing object or create a new one
            let object = result ?? PFObject(className: aClass)
            object.setObject(currentUser, forKey: user)
            try object.save()

        } catch {
            print(error)
        }
    }
}

代码首先在数据库中查找现有对象。 如果它找到一个,它会更新它。如果找不到,它会创建一个新的。这是使用 Parse SDK 并且仅使用同步网络函数(.getFirstObject、.save)。

出于某种原因,这似乎不是串行执行的,因为有时会将一个新对象写入数据库,尽管已经存在一个应该只更新的对象。

我是否遗漏了有关 GCD 的信息?

来自documentation on dispatch_queue_attr_make_with_qos_class:

relative_priority: A negative offset from the maximum supported scheduler priority for the given quality-of-service class. This value must be less than 0 and greater than MIN_QOS_CLASS_PRIORITY

因此您应该为此传递一个小于 0 的值。

但是,如果您不需要优先级,您可以在创建队列时简单地将 DISPATCH_QUEUE_SERIAL 传递到 attr 参数中。例如:

let mySerialQueue = dispatch_queue_create("com.myApp.mySerialQueue", DISPATCH_QUEUE_SERIAL)