【问题标题】:How to make a serial queue with GCD如何使用 GCD 制作串行队列
【发布时间】:2016-06-04 11:07:11
【问题描述】:

我尝试使用 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 的某些内容?

【问题讨论】:

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


    【解决方案1】:

    来自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)
    

    【讨论】:

    • 那么这是否意味着偏移量0实际上意味着没有偏移量,因此是最高优先级,相当于UI修改的主队列?
    • @Manuel 是的,您可以假设 0 的偏移量等同于主队列(尽管文档从未明确说明这一点),因此您应该使用小于此的值。
    • @Manuel 乐于助人:)
    • @Manuel 抱歉,稍作修正,偏移量与您所在的 QOS 类相关,尽管您使用的是最高 QOS 类,因此您可以假设偏移量为 0 将是等效的到主队列。如果您使用的是较低的 QOS 类,那么偏移量 0 并没有任何等效项,但您仍然需要提供小于 0 的值(以及高于 MIN_QOS_CLASS_PRIORITY)。
    • @Manuel 你是对的,连续性和优先级绝不是矛盾的。但是,这是我在当前代码中看到的唯一问题,因此假设(可能过早地)它必须干扰队列的内部工作。我应该保留我之前的评论,在那里我询问您是否通过在主队列上运行此函数来检查这是否是 Parse 问题(并查看您是否遇到同样的问题)。不过我对 Parse 一点也不熟悉,所以恐怕我无法为您提供任何帮助。
    猜你喜欢
    • 2012-12-17
    • 2022-08-23
    • 1970-01-01
    • 2013-10-11
    • 2014-04-28
    • 2013-03-15
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多