使用for循环处理CloudKit查询记录时遭遇序列合规性错误求助
问题翻译
我不确定如何解决以下错误,这段代码之前在我的应用中可以正常运行:
错误信息:"For-in loop requires 'Result<(matchResults: [(CKRecord.ID, Result<CKRecord, any Error>)], queryCursor: CKQueryOperation.Cursor?), any Error>' to conform to 'Sequence'"
相关代码:
func fetchLocations() { var locationArray: [CLLocation] = [] let publicDB = CKContainer.default().publicCloudDatabase let query = CKQuery(recordType: "location", predicate: NSPredicate(value: true)) publicDB.fetch(withQuery: query, inZoneWith: nil) { (records) in if records != nil{ for record in records { if let location = record["location"] as? CLLocation { locationArray.append(location) } }//end for }else {return} }//end fetch }
问题原因
CloudKit的API更新了,现在publicDB.fetch(withQuery:)的回调参数records是Result类型,不是直接的查询结果数组。你之前的代码直接把它当成可遍历序列使用,所以触发了错误。
修复方案
需要先解析Result的成功/失败状态,再从成功返回的元组里取出真正的记录集合,最后遍历处理每个记录的结果:
func fetchLocations() { var locationArray: [CLLocation] = [] let publicDB = CKContainer.default().publicCloudDatabase let query = CKQuery(recordType: "location", predicate: NSPredicate(value: true)) publicDB.fetch(withQuery: query, inZoneWith: nil) { result in // 先处理整体请求的成功/失败 switch result { case .success(let queryResult): // 遍历matchResults里的每个记录项 for (_, recordResult) in queryResult.matchResults { // 处理单个记录的成功/失败 switch recordResult { case .success(let record): if let location = record["location"] as? CLLocation { locationArray.append(location) } case .failure(let error): print("单条记录获取失败: \(error.localizedDescription)") } } // 如果需要分页加载,可用queryCursor继续请求下一页 if let cursor = queryResult.queryCursor { // publicDB.fetch(with: cursor) { ... } } case .failure(let error): print("整体查询失败: \(error.localizedDescription)") } } }
额外说明
- 新版API通过
Result明确区分了请求失败、单条记录获取失败的场景,你可以根据业务需求补充对应的错误处理逻辑。 - 如果数据量较大,记得利用返回的
queryCursor实现分页查询,避免一次性加载过多数据。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

