从当前 iCloud 用户获取 CloudKit 记录

Posted

技术标签:

【中文标题】从当前 iCloud 用户获取 CloudKit 记录【英文标题】:Fetch CloudKit records from current iCloud user 【发布时间】:2016-04-07 10:16:21 【问题描述】:

我想从当前登录的用户那里获取所有位置记录。

这会在 CloudKit 上创建位置记录:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    let location = locations.last!
    let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
    addCrumbPoint(center)
    let locationRecord = CKRecord(recordType: "location")
    locationRecord["location"] = location
    let publicData = CKContainer.defaultContainer().publicCloudDatabase
    publicData.saveRecord(locationRecord)  record, error in
    

但是我将如何仅提取当前登录用户的位置记录?

我想用它在地图上创建以前旅程的面包屑,但只是让它打印一个列表将是一个很好的开始!

到目前为止,这是我的代码:

 func getLocationAsync(complete: (instance: CKRecordID?, error: NSError?) -> ()) 
    let container = CKRecordID(recordName: "Location")
    publicDB.fetchRecordWithID(location)  fetchedLocation, error in
        if error != nil 
            print(error!.localizedDescription)
            complete(instance: nil, error: error)
         else 
            print("fetched Location \(recordID?.recordName)")
            complete(instance: recordID, error: nil)
        
    

【问题讨论】:

【参考方案1】:

如果您的目标是保存用户的面包屑位置而不是与其他用户共享,那么请使用私有数据库。 这样就可以检索到用户的所有位置记录。

如果您想使用公共数据库,则将 CKReference 类型的条目添加到指向用户记录的位置记录。这样您就可以使用基于用户记录 ID 的谓词

【讨论】:

谢谢,我希望所有位置数据都转到 CloudKit,但我只想在此视图上显示单个用户数据。你能告诉我如何实现你的底层解决方案吗? 汤姆,可悲的是,您的方法存在缺陷;如果用户越过他的路径,则保存将失败,如果两个用户越过彼此的位置,则保存也将失败。您还需要专注于确保以尽可能大的块向云发送最少数量的数据,以使事情尽可能高效。这个想法还依赖于用户在四处走动时有 wifi 连接,虽然完全有可能,但风险很高。更好地将您的面包屑保存在核心数据中,将其完全分组到一个数据块中并将其保存为单个记录。 实现起来很简单,但我不建议使用 publicDB 来存储用户的位置。它将被苹果拒绝。在私有数据库中并且只能由用户自己访问是可以的。

以上是关于从当前 iCloud 用户获取 CloudKit 记录的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 CloudKit 从 iCloud 驱动器获取数据

iCloud、CloudKit、iOS 8、Apple id

CloudKit 获取用户 iTunes 备份

Swift Cloudkit 获取当前用户信息以在整个应用程序中使用

iCloud / CloudKit 用户的唯一标识符

清除/清除 CloudKit 容器的所有用户 iCloud 记录