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