如何使用 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)
我试着用 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)