使用 CloudKit 保存尝试对成员“保存(_:completionHandler :)”的模糊引用

Posted

技术标签:

【中文标题】使用 CloudKit 保存尝试对成员“保存(_:completionHandler :)”的模糊引用【英文标题】:Ambiguous reference to member 'save(_:completionHandler:)' with CloudKit save attempt 【发布时间】:2020-01-18 19:31:47 【问题描述】:

在更新参考列表并在此代码块的第一行收到错误后,我正在尝试保存回 CloudKit。

错误:对成员 'save(_:completionHandler:)' 的引用不明确

CKContainer.default().publicCloudDatabase.save(establishment)  [unowned self] record, error in
  DispatchQueue.main.async 
    if let error = error 
      print("error handling to come")
     else 
      print("success")
    
  

这位于用户将遵循给定位置(Establishment)的功能中。我们正在获取现有机构及其关注者记录,检查所选用户是否在其中,如果没有,则将它们附加到列表中(或者如果关注者列表为空,则创建它)。

Edit, in case helpful
//Both of these are passed in from the prior view controller
  var establishment: Establishment?
  var loggedInUserID: String?

@objc func addTapped() 
    // in here, we want to take the logged in user's ID and append it to the list of people that want to follow this establishment
    // which is a CK Record Reference
    let userID = CKRecord.ID(recordName: loggedInUserID!)
    var establishmentTemp: Establishment? = establishment
    var followers: [CKRecord.Reference]? = establishmentTemp?.followers

    let reference = CKRecord.Reference(recordID: userID, action: CKRecord_Reference_Action.none)
    if followers != nil 
      if !followers!.contains(reference) 
        establishmentTemp?.followers?.append(reference)
      
     else 
      followers = [reference]
      establishmentTemp?.followers = followers
      establishment = establishmentTemp
    

[这是粘贴在问题顶部的 CKContainer.default.....save 块出现的地方]

我浏览了有关“模糊参考”的各种帖子,但无法找出问题的根源。尝试显式设置 establisthmentTemp 和追随者的类型,以防万一出现问题(基于其他相关帖子的解决方案),但没有运气。 恐怕我作为一个相对缺乏经验的新手没有想法!

帮助表示赞赏。

【问题讨论】:

【参考方案1】:

记录我想出的解决方案:

两个问题的结合:

    我试图保存更新版本的 CK 记录而不是更新 我没有将 CK 记录传递给 save() 调用 - 而是一个自定义对象

(我认为第二点是“对成员的模糊引用”的原因 错误)

我通过将保存尝试(问题中的第一个代码块)替换为:

//first get the record ID for the current establishment that is to be updated
let establishmentRecordID = establishment?.id
//then fetch the item from CK

CKContainer.default().publicCloudDatabase.fetch(withRecordID: establishmentRecordID!)  updatedRecord, error in
  if let error = error 
    print("error handling to come")
   else 

//then update the 'people' array with the revised one
    updatedRecord!.setObject(followers as __CKRecordObjCValue?, forKey: "people")
    //then save it    
    CKContainer.default().publicCloudDatabase.save(updatedRecord!)  savedRecord, error in
    
  

【讨论】:

以上是关于使用 CloudKit 保存尝试对成员“保存(_:completionHandler :)”的模糊引用的主要内容,如果未能解决你的问题,请参考以下文章

如何将字典保存到cloudkit

保存 CKDatabaseSubscription 得到“CloudKit 访问被用户设置拒绝”

CloudKit,无法将 NSDate 保存到日期/时间字段,“无效日期”

将 CloudKit 记录保存到本地文件保存除 CKAsset 之外的所有字段

Cloudkit:“错误保存记录写入操作不允许”

CloudKit 订阅内部服务器错误