使用 Asset 和 Location 字段
CloudKit提供专门用于存储大型数据文件和按位置获取记录的字段类型。使用这些数据类型可以利用CloudKit为此类数据提供的性能改进。您还可以按位置获取记录。例如,在用户定义的区域中的地图上显示记录。
在CloudKit中存储大文件
您可以使用Asset
字段类型在CloudKit中存储大型数据文件。Asset
由关联记录拥有,CloudKit为您处理垃圾回收。CloudKit还可以有效地上传和下载Asset
。
在代码中,Asset
字段类型由CKAsset
对象表示。此代码片段将记录中的Asset
字段设置Artwork
为资源文件。
// Create a URL to the local file
NSURL *resourceURL = [NSURL fileURLWithPath:@"…"];
if (resourceURL){
CKAsset *asset = [[CKAsset alloc] initWithFileURL:resourceURL];
artworkRecord[@"image"] = asset;
}
保存记录后,文件将上载到iCloud。
添加类似的代码,将带有Asset
字段的记录类型保存到您的应用程序并运行它。要保存记录,请阅读维护CloudKit记录的本地缓存。
验证您的步骤
要验证您对架构和记录的更改是否已保存到iCloud,请阅读“常规工作流程” 和“ 获取更改”。当您使用Asset
对象查看记录时,CloudKit仪表板会显示二进制数据的大小。
添加位置字段
如果您的记录具有地址或其他位置数据,则可以将其保存为CLLocation
记录中的对象,然后按位置获取记录。例如,您的应用可能会显示代表地图上记录的图钉。
此代码片段使用CLGeocoder
该类将字符串地址转换为位置对象并将其存储在记录中。
CLGeocoder *geocoder = [CLGeocoder new];
[geocoder geocodeAddressString:artwork[kArtworkAddressKey] completionHandler:^(NSArray *placemark, NSError *error){
if (!error) {
if (placemark.count > 0){
CLPlacemark *placement = placemark[0];
artworkRecord[kArtworkLocationKey] = placement.location;
}
}
else {
// insert error handling here
}
// Save the record to the database
}];
添加类似的代码,将带有Location
字段的记录类型保存到您的应用程序并运行它。要保存记录,请阅读维护CloudKit记录的本地缓存。
验证您的步骤
在CloudKit仪表板中查看记录时,它会显示位置字段的经度和纬度。
按位置获取记录
在数据库中有位置数据后,可以使用包含记录类型,谓词和排序描述符的查询按位置获取记录。Location
必须为谓词中指定的字段建立索引才能使提取成功。
// Get the public database object
CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
// Create a predicate to retrieve records within a radius of the user's location
CLLocation *fixedLocation = [[CLLocation alloc] initWithLatitude:37.7749300 longitude:-122.4194200];
CGFloat radius = 100000; // meters
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"distanceToLocation:fromLocation:(location, %@) < %f", fixedLocation, radius];
// Create a query using the predicate
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Artwork" predicate:predicate];
// Execute the query
[publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {
if (error) {
// Error handling for failed fetch from public database
}
else {
// Display the fetched records
}
}];
此代码片段提取位于旧金山100,000米范围内的所有记录。
在此iOS应用程序中,将获取固定位置指定半径内的图稿。
要了解有关位置和地图的更多信息,请阅读位置和地图编程指南。
概括
在本章中,您学习了如何:
- 添加
Asset
添加一个类型的记录类型CKAsset
字段,记录和保存记录 Location
使用CLLocation
对象将类型添加到记录类型- 按位置获取对象
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论