gpt4 book ai didi

ios - CloudKit - 如果记录不存在如何保存

转载 作者:可可西里 更新时间:2023-11-01 03:51:56 25 4
gpt4 key购买 nike

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

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

我找不到对电影记录类型执行“如果不存在则保存”类型操作的方法。我可以在查询的 completionBlock 中进行保存,但这两个操作不会是保证唯一性的原子事务。据我所知,将 CKQueryOperationCKModifyRecordsOperation 链接起来也是如此。

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

最佳答案

如果我正确理解了您的用例,您可以将 movieRecord.recordID.recordName 设为电影名称并使用 CKModifyRecordsOperationsavePolicy 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 中处理此冲突,但在您的特定用例中,您无法对冲突错误执行任何操作,因此每个电影记录将是第一个使用该 CKRecordID 保存的记录。

关于ios - CloudKit - 如果记录不存在如何保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com