6

我正在尝试创建一个包含唯一值的记录类型,并将充当另一个记录类型的目标引用对象。例如,记录类型 - 电影将包含用户提交的唯一电影列表。并且 FavoriteMovies 将包含一个用户参考和一个电影参考。用户可以从现有电影列表中进行选择,或向其中添加新电影。

如果我创建一个新的电影记录,而另一个用户创建一个具有相同名称的新记录(在我检索到电影列表之后,但在我尝试添加新记录之前),就会出现问题。这两条新记录被视为具有不同记录 ID 的不同记录。这意味着一旦我保存了新的,将有两个具有保存名称的电影实例。

我无法找到对电影记录类型执行“如果不存在则保存”类型操作的方法。我可以在查询的完成块中保存,但这两个操作不会是保证唯一性的原子事务。据我所知,CKQueryOperationCKModifyRecordsOperation.

有没有办法仅在单个事务中不存在该值时才插入记录?

4

1 回答 1

6

如果我正确理解了您的用例,您可以将 movieRecord.recordID.recordName 设为电影的名称,并使用CKModifyRecordsOperationwithsavePolicy IfServerRecordUnchanged来有效地 Save If Not Exists。如果您尝试保存服务器上已经存在的记录,它将返回一个您可以忽略的错误:

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 的第一个保存记录。

于 2014-07-17T01:13:05.773 回答