如何使用GCD创建一个串行队列

时间:2016-02-22 20:49:40

标签: swift parse-platform grand-central-dispatch

我尝试使用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的事情吗?

1 个答案:

答案 0 :(得分:2)

来自documentation on dispatch_queue_attr_make_with_qos_class

  

relative_priority:与给定服务质量类的最大支持调度程序优先级的负偏移量。 此值必须小于0 且大于MIN_QOS_CLASS_PRIORITY

因此,您应为此传递小于0的值。

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

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