如何使用 CKRecord.ID 从 CloudKit 中获取多个类型?
How to Fetch Multiple Types From CloudKit using CKRecord.ID?
当使用 CKRecord.ID
从 CloudKit
获取多个类型时,出现以下错误。
错误
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.ID
从 CloudKit
检索多个类型?
您尚未定义接受 CKRecord
的初始化程序。
这将使它编译:
extension Lib {
init(_: CKRecord) { fatalError() }
}
摆脱你的 ?? []
然后从那里开始!
如果你使用准确的复数可能对你有帮助:
operation.fetchRecordsCompletionBlock = { records, error in
guard let libs = records?.values.map(Lib.init)
@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)!
}
}
"name"、"asset" 和 "rating" 是 CloudKit 仪表板记录中的自定义字段名称。我还按照说明删除了 fetch
函数中的 ?? []
。
CloudKit Tutorial: Getting Started 是一个很好的参考。
当使用 CKRecord.ID
从 CloudKit
获取多个类型时,出现以下错误。
错误
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.ID
从 CloudKit
检索多个类型?
您尚未定义接受 CKRecord
的初始化程序。
这将使它编译:
extension Lib {
init(_: CKRecord) { fatalError() }
}
摆脱你的 ?? []
然后从那里开始!
如果你使用准确的复数可能对你有帮助:
operation.fetchRecordsCompletionBlock = { records, error in
guard let libs = records?.values.map(Lib.init)
@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)!
}
}
"name"、"asset" 和 "rating" 是 CloudKit 仪表板记录中的自定义字段名称。我还按照说明删除了 fetch
函数中的 ?? []
。
CloudKit Tutorial: Getting Started 是一个很好的参考。