我试图制作一个包含唯一值的记录类型,并将其用作其他记录类型的目标引用对象。例如,“记录类型-电影”将包含用户提交的电影的唯一列表。FavoriteMovies将包含一个用户参考和一个电影参考。用户可以从现有电影列表中进行选择,也可以向其中添加新电影。
如果我创建一个新的电影记录,而另一个用户创建一个具有相同名称的新记录,则会发生问题(在我检索了电影列表之后,但是尝试添加新的电影列表之前)。这两个新记录被视为具有不同recordID的不同记录。这意味着一旦我保存了新的电影,就会有两个带有保存名称的电影实例。
我无法找到一种对“电影记录类型”执行“保存如果不存在”类型的操作的方法。我可以在查询的completeBlock中进行保存,但是这两个操作不是保证唯一性的原子事务。据我所知,这也是与链接的情况下CKQueryOperation
用CKModifyRecordsOperation
。
只有在单个事务中不存在该值时,才可以插入记录吗?
如果我正确理解了您的用例,则可以使movieRecord.recordID.recordName成为电影的名称,并CKModifyRecordsOperation
与之savePolicy
IfServerRecordUnchanged
一起使用以有效地保存“不存在”。如果尝试保存服务器上已存在的记录,它将返回一个错误,可以忽略该错误:
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
但在您的特定用例中,您不能对冲突错误做任何事情,因此每个Movie记录将是带有CKRecordID的第一个保存的记录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句