面试题答案
一键面试处理思路
- 检测冲突:CloudKit 在执行某些操作(如保存记录)时,会返回包含冲突信息的错误。可以通过捕获这些错误来检测冲突。
- 定义冲突处理策略:
- 以云端数据为准:直接用云端数据覆盖本地数据。
- 以本地数据为准:将本地数据上传,覆盖云端数据。
- 合并策略:对于可合并的数据类型(如数组、字典等),尝试合并数据。
关键代码实现(以以云端数据为准为例)
import CloudKit
func saveRecord(record: CKRecord, completion: @escaping (Result<CKRecord, Error>) -> Void) {
let container = CKContainer.default()
let publicDatabase = container.publicCloudDatabase
publicDatabase.save(record) { [weak self] savedRecord, error in
if let error = error {
if case CKError.Code.conflict = (error as NSError).code {
// 检测到冲突,获取云端记录
let recordID = record.recordID
publicDatabase.fetch(withRecordID: recordID) { cloudRecord, error in
if let cloudRecord = cloudRecord {
// 以云端数据为准,重新保存
self?.saveRecord(record: cloudRecord) { result in
switch result {
case.success(let newRecord):
completion(.success(newRecord))
case.failure(let newError):
completion(.failure(newError))
}
}
} else if let error = error {
completion(.failure(error))
}
}
} else {
completion(.failure(error))
}
} else if let savedRecord = savedRecord {
completion(.success(savedRecord))
}
}
}
合并策略代码示例(假设记录中有一个字符串数组字段可合并)
func mergeArrays(localArray: [String], cloudArray: [String]) -> [String] {
var mergedArray = localArray
for cloudItem in cloudArray {
if!mergedArray.contains(cloudItem) {
mergedArray.append(cloudItem)
}
}
return mergedArray
}
func handleConflictWithMerge(recordID: CKRecord.ID, localRecord: CKRecord, cloudRecord: CKRecord, completion: @escaping (Result<CKRecord, Error>) -> Void) {
let container = CKContainer.default()
let publicDatabase = container.publicCloudDatabase
// 假设字段名为 "stringArrayField"
if let localArray = localRecord["stringArrayField"] as? [String],
let cloudArray = cloudRecord["stringArrayField"] as? [String] {
let mergedArray = mergeArrays(localArray: localArray, cloudArray: cloudArray)
localRecord["stringArrayField"] = mergedArray
}
publicDatabase.save(localRecord) { savedRecord, error in
if let error = error {
completion(.failure(error))
} else if let savedRecord = savedRecord {
completion(.success(savedRecord))
}
}
}
在实际应用中,需要根据业务需求选择合适的冲突处理策略,并针对不同的数据类型和结构进行具体的处理逻辑设计。