2016-02-22 81 views
0

我試圖讓網絡操作的串行隊列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的信息?

回答

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) 
+1

那麼這是否意味着偏移0實際上意味着沒有偏移,因此最高優先級,這相當於UI修改的主隊列? – Manuel

+1

@Manuel是的,你可以假設0的偏移等同於主隊列(雖然文檔從未明確地說過),所以你應該使用小於這個值的值。 – Hamish

+0

你是一個天才 – Manuel