CloudKitQueues 0.0.2

CloudKitQueues 0.0.2

Matt Greenfield 维护。



  • Matt Greenfield

CloudKitQueues

CloudKit记录的队列管理器,简化了个别和批量操作的实现。

无缝个别和批量操作

CloudKitQueues提供了对单个CKRecords和CKRecordIDs执行获取、保存和删除操作的方法。然后,这些操作被智能地批量组合,以获得最少CloudKit请求下最快的结果。

这可以在CloudKit请求限制下,以最小的请求数量获得最佳性能。

无需手动队列管理

使用CloudKitQueues,您不再需要管理循环中的批量CloudKit操作,也不需要管理批量操作的失败或重试。只需在单个CKRecords和CKRecordIDs上调用 fetch()save()delete(),CloudKitQueues将确保它们以最高效的方式批量组合。

相同的方法既适用于单个独立操作,也适用于大型批量操作。CloudKitQueues将确保它们在所有情况下都得到最佳性能。

个别完成闭包

每个fetch、save和delete请求都可以传递一个可选的完成闭包,该闭包将在数据库操作完成后执行。这允许将数百个并发数据库操作一起批处理,同时能够单独对每个记录执行完成操作。

queue.fetch(ckRecordId) { ckRecord, error in
    if let ckRecord = ckRecord {
        print("ckRecord: " + ckRecord)
    }
}

自动速率限制管理

CloudKitQueues会观察并尊重CloudKit的速率限制超时,并在超时允许后自动重试。

快速和慢速队列

CloudKitQueues管理两组队列

  • 快速队列:用于快速操作,例如用户期待在UI中看到结果的操作。
  • 慢速队列:用于慢速操作,例如用户不期待看到即时结果的备份、恢复和删除操作。

当获取记录时,您可以选择使用queue.fetch(ckRecordId)queue.slowFetch(ckRecordId)

当保存记录更改时,您可以选择使用queue.save(ckRecord)queue.slowSave(ckRecord)

当删除记录时,您可以选择使用queue.delete(ckRecordId)queue.slowDelete(ckRecordId)

CloudKitQueues内部管理这些队列,以便将“快速”操作批处理在一起并尽可能快地执行,而将“慢速”操作批处理在一起并在CloudKit确定能源和网络条件最合适时执行。

设置

pod 'CloudKitQueues'

或者直接将CloudKitQueue.swift放入您的项目中。

示例

let publicQueue = CloudKitQueue(for: CKContainer.default().publicCloudDatabase)
let privateQueue = CloudKitQueue(for: CKContainer.default().privateCloudDatabase)

快速队列操作

请注意,所有的 save()fetch()delete() 方法都接受可选的完成闭包。

// save the CKRecords for all cars
for car in cars { 
    publicQueue.save(car.ckRecord) 
}
// fetch the CKRecords for all cars, and assign the fetched records
// to their car objects on fetch completion
for car in cars { 
    publicQueue.fetch(car.ckRecordId) { ckRecord, error in
        car.ckRecord = ckRecord
    }
}
// delete the remote CKRecords for all cars
for car in cars { 
    publicQueue.delete(car.ckRecordId)
}

慢队列操作

// slow save the CKRecords for all cars
for car in cars { 
    publicQueue.slowSave(car.ckRecord) 
}
// slow fetch the CKRecords for all cars, and assign the fetched records
// to their car objects on fetch completion
for car in cars { 
    publicQueue.slowFetch(car.ckRecordId) { ckRecord, error in
        car.ckRecord = ckRecord
    }
}
// slow delete the remote CKRecords for all cars
for car in cars { 
    publicQueue.slowDelete(car.ckRecordId)
}