【问题标题】:How to Fetch Multiple Types From CloudKit using CKRecord.ID?如何使用 CKRecord.ID 从 CloudKit 获取多种类型?
【发布时间】:2020-04-29 21:43:01
【问题描述】:

当使用CKRecord.IDCloudKit 获取多种类型时,出现以下错误。

错误

Cannot invoke 'map' with an argument list of type '(@escaping (CKRecord.ID, String, CKAsset, Int) -> Lib)'

CloudKit 获取函数

static func fetch(_ recordID: [CKRecord.ID], completion: @escaping (Result<[Lib], Error>) -> ()) {
    let recordID: [CKRecord.ID] = recordID
    let operation = CKFetchRecordsOperation(recordIDs: recordID)
    operation.qualityOfService = .utility

    operation.fetchRecordsCompletionBlock = { (record, err) in
        guard let record = record?.values.map(Lib.init) ?? [] //returns error here
        else {
            if let err = err {
                completion(.failure(err))
            }
            return
        }

        DispatchQueue.main.async {
            completion(.success(record))
        }
    }

    CKContainer.default().publicCloudDatabase.add(operation)
}

struct Lib {
    var recordID: CKRecord.ID
    var name: String
    var asset: CKAsset
    var rating: Int
}

如何使用CKRecord.IDCloudKit 检索多种类型?

【问题讨论】:

    标签: swift cloudkit


    【解决方案1】:

    您尚未定义接受 CKRecord 的初始化程序。

    这将使它编译:

    extension Lib {
      init(_: CKRecord) { fatalError() }
    }
    

    摆脱你的?? [] 并从那里开始!

    如果你使用准确的复数形式可能会对你有所帮助:

    operation.fetchRecordsCompletionBlock = { records, error in
      guard let libs = records?.values.map(Lib.init)
    

    【讨论】:

      【解决方案2】:

      @Jessey 的回答非常有帮助,但一直返回 fatalError()。最终的工作是添加到init

      struct Lib {
          var recordID: CKRecord.ID
          var name: String
          var asset: CKAsset
          var rating: Int
      
          init(record: CKRecord){
              recordID = record.recordID
              name = (record["name"] as? String)!
              asset = (record["asset"] as? CKAsset)!
              rating = (record["rating"] as? Int)!
          }
      }
      

      “名称”、“资产”和“评级”是 CloudKit 仪表板记录中的自定义字段名称。根据指令,我还删除了fetch 函数中的?? []

      CloudKit Tutorial: Getting Started 是一个很好的参考。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 2023-04-07
        • 2020-02-29
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多