2014-07-16 70 views
6

我試圖創建包含唯一值的記錄類型,並且將作爲一個目標的參照物到另一個記錄類型。例如,記錄類型 - 電影將包含用戶提交的電影的唯一列表。 FavoriteMovies將包含用戶參考和電影參考。用戶可以從現有的電影列表中進行選擇,或向其中添加新的電影。CloudKit - 如何保存記錄如果NOT EXISTS

的問題發生,如果我創建一個新的電影紀錄,而另一個用戶創建了同名的新紀錄(之後我檢索到的電影列表,但在此之前我嘗試添加一個新的)。這兩條新記錄被視爲具有不同記錄ID的不同記錄。這意味着,一旦我保存了新的電影,就會有兩個電影的存檔名稱。

我無法找到執行保存如果NOT EXISTS操作類型的電影記錄類型的方式。我可以在查詢的completionBlock中進行保存,但這兩個操作不會是原子事務以保證唯一性。據我所知,鏈CKQueryOperationCKModifyRecordsOperation也是這種情況。

是否有插入一條記錄只有當值不存在於一個單一的交易方式?

回答

6

如果我理解正確你的使用情況,您可以movieRecord.recordID.recordName影片的名稱,並使用與CKModifyRecordsOperationsavePolicyIfServerRecordUnchanged有效保存。如果不存在。

let saveRecordsOperation = CKModifyRecordsOperation() 
saveRecordsOperation.recordsToSave = [movieRecord] 
saveRecordsOperation.savePolicy = .IfServerRecordUnchanged 

隨着savePolicy IfServerRecordUnchanged這個操作會保存一個新的電影記錄,如果不存在,就:然後它會如果您嘗試保存已存在的服務器上的記錄返回,你可以忽略的錯誤(如果不存在),但在後續任何嘗試覆蓋服務器上已存在的電影記錄(假設它不是從服務器獲取的記錄的更新修改版本)時將返回以下錯誤:

<CKError 0x14d23980: "Server Record Changed" (14/2017); server message = "record to insert already exists"> 

你可以在perRecordCompletionBlock中處理這個衝突,但是在你的具體用例中你可以對衝突錯誤做任何事情,因此每個電影記錄將成爲具有該CKRecordID的第一個保存的記錄。

+0

不幸的是,這並不適用於我。我正在創建一個新的movieRecord實例來添加到列表中。如果另一個用戶創建了一個具有相同名稱的記錄(在我檢索了電影列表之後,但在嘗試添加新電影之前),由於它們具有不同的recordID,因此它們被視爲不同的記錄。這意味着即使我的savePolicy設置爲IfServerRecordUnchanged,該操作也不會引發錯誤。相反,我會看到兩個具有相同名稱的不同記錄。 – Denis

+0

明白了。如果你製作了movieRecord.recordID.recordName這個電影的名字,它會起作用。我有一個使用公共數據庫的類似用例,這就是我爲保持公共記錄的獨特性所做的。我對答案做了一個編輯,以說明這個假設。 –

+0

好主意,這個工作會爲我做。謝謝! – Denis

相關問題