我试图在CloudKit中存储联系人组,如果我尝试创建一大组记录,CKReferenced到单个组记录,我会收到错误.
该限制似乎约为700左右的记录.
有没有其他人看到类似的结果,或者可以确认限制的存在(或不存在)?我无法在文档中找到任何内容,也无法通过Google找到任何内容.
注意:我已经将我提交的记录拆分为400或更少的批次,因为这似乎是一个硬限制.
我对如何最好地保存包含CloudKit中其他对象数组的对象感到困惑.
假设我有一个待办事项列表应用程序,它有不同的项目集合.我如何保存/获取整个项目集合?
我是否有一个Record类型的Collection,它有一个名为"Name"的String属性,然后是一个名为"Items"的引用列表属性?
我知道Record类型的Item需要有一个名为"Collection"的引用属性,因为CloudKit如何从子对象引用它的父对象.
我已设法使用以下代码保存没有任何Item实例的集合
func addCollection(collection: Collection!, completion: (error: NSError!) -> ()) {
if collection == nil
return
}
let collectionRecord = CKRecord(recordType: "Collection")
CollectionRecord.setObject(collection.name, forKey: "Name")
privateDB.saveRecord(collectionRecord) {
record, error in
dispatch_async(dispatch_get_main_queue()) {
completion(error: error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一个选项是在保存Collection时,循环遍历Item的所有实例并单独保存它们,它们的Reference Attribute to Collection在CloudKit端进行连接,但这似乎是太多的网络调用.
在我的CloudKit设置中,我有一个Person记录类型,每个人都有一个Friend属于CKReference另一个Person对象的属性.
我拿了所有Person CKRecord的.我在桌子上列出这些人并将他们的朋友列在他们身上.目前我只是使用CKReference和单独获取每个朋友recordID.
这是我能看到的唯一方法,但最佳做法是什么?特别是因为我可能吸引了大量的朋友.单独获取所有这些对象似乎违反直觉.
我想知道是否有一个类似CoreData的方法,你可以选择在主要提取中获取相关对象?因此,例如,当我获取Person它时,它也会自动获取朋友.
是否有人有使用经验的CloudKit选项DeleteSelf了CKReference?这是我从文档中得到的:
DeleteSelf
引用记录的删除操作.删除记录还会删除包含指向该记录的CKReference对象的所有记录.删除附加记录可能会触发更多记录的级联删除.删除在默认区域中是异步的,在自定义区域中是立即的.
所以我一直在测试这个,我创建了多个CKReference对象,使用CloudKit Dashboard和使用我的应用程序.每当我使用我的应用程序执行此操作时,我都会像这样创建引用:
let reference:CKReference = CKReference(recordID: savedFriend.friendID, action: CKReferenceAction.DeleteSelf)
Run Code Online (Sandbox Code Playgroud)
我必须做错事,因为无论何时我去手动删除使用仪表板引用的记录,或者设置我的应用程序以编程方式删除它,记录都会消失,但引用永远不会被删除.我想也许我应该等待,它最终会发生,但几小时后它仍然在那里检查,就像它本应该删除自己.这有点令人沮丧,因为我设计了一些我的代码,假设这可以工作,现在我可以有一个浪费资源的应用程序试图找到一个CKRecord不再存在的.我应该不依靠这个来工作吗?我感谢任何帮助或建议.
更新〜04/07/2016
我跳了回来,并发布了一个更新,问题已经解决了.我并不完全相信这个问题不会重新出现,所以我昨晚寻求一些保证.我创建了5个不同的,CKRecords并创建了各种不同的CKReference对象,以便在我的数 然后我继续为CKReferenceAction.DeleteSelf每个引用设置选项(我通过仪表板手动尝试了两个,其他三个以编程方式完成).无论如何,我等了几分钟然后删除了引用的记录......十分钟后,引用仍然存在.我又等了5-10分钟,他们还在那里,所以我上床睡觉,假设早上他们肯定要走了,对吧?错误!12个小时后,CKReference条目仍在那里,引用的记录仍然没有.我肯定是在挠头,似乎这是一个错误CloudKit.我应该提一下,我也注意到我的仪表板中有一些奇怪的行为.在过去的四天左右,在左下角,它一直表示它是"重新索引开发数据",这里是一张图片,例如:

这会导致这个问题吗?有人熟悉这个问题并知道解决这个问题的方法吗?任何建议,将不胜感激.我已经向Apple提交了一份错误报告.
.DeleteSelf如何真正起作用?文件说:
当引用对象的操作设置为CKReferenceActionDeleteSelf时,引用的目标(即存储在引用的recordID属性中的记录)将成为源记录的所有者.删除目标(所有者)记录将删除其所有源记录.
但我的印象是删除目标并不总是删除源.它仍然在容器中,客户端下载它,并期望参考点到某处,但在客户端上构建服务器数据存储片时,目标不存在,这是非常烦人的?
你怎么对待这个案子?你忽略那种记录?或者您定期查找CloudKit存储,搜索损坏的记录以删除它们?
或者不是删除记录,最好设置一个属性,使其处于已删除状态,但将其保留在数据库中?
我有一个RecordType Account和另一个Friends.因为Account我正在设置RecordID每个记录的创建,我有一个列Name.
对于朋友,我有两列,Me和MyFriend.MyFriend是包含RecordID帐户的参考.
如何检索作为我朋友的帐户名称?我需要查询Friends以获取Me我所在的所有记录,RecordID然后我需要使用这些记录的引用来从Account表中获取Names.
我尝试了以下但没有得到任何结果:
let predicate = NSPredicate(format: "Me = %@", recordID)
let query = CKQuery(recordType: "Friends", predicate: predicate)
publicDB.performQuery(query, inZoneWithID: nil) { (results, error) -> Void in
if error != nil {
println("Error fetching from Friends table: \(error.description)")
} else {
for friend in results {
var key = friend.objectForKey("MyFriend") as String
self.publicDB.fetchRecordWithID(CKRecordID(recordName: key), completionHandler: { (record, …Run Code Online (Sandbox Code Playgroud) 我正在尝试为包含用户的 CKReference 字段的记录设置 CKSubscription。但是无论何时创建记录,它都会忽略复合谓词的这一部分,并且通知永远不会出现。在 CKSubscription 的谓词中使用 CKReference 有什么不同吗?我进入仪表板以在我自己的用户记录 ID 下输入新记录(在模拟器中运行另一个用户时),因为我相信我读到如果记录来自设备,它将不会收到通知。非常感谢任何见解,因为我已经坚持了一个星期,并且无法在网上找到任何特定于此的内容。我能够获得真正的类型谓词通知,所以我认为我的基本设置没问题。
在仪表板中,我看到两个测试用户都有一个通用订阅,但没有看到任一用户的任何特定记录 ID(这有关系吗?):
Notifications.read (equals string)
Notifications.user (equals reference)
Run Code Online (Sandbox Code Playgroud)
当我执行 fetchAllSubscriptionsWithCompletionHandler 方法时,它会在调试器中将此设备的当前用户的特定记录 ID 显示为 CKReference。所以我不知道为什么它不起作用。
这是我首先创建 CKReference 然后将其用于谓词的代码:
var recordIDString = CKRecordID(recordName: "_a86dac8ee05f8c6ab35746bf9663d7b8")
// I normally store this string in the NSUserDefaults.
let userRef = CKReference(recordID: recordIDString, action: .DeleteSelf)
let predicate = NSPredicate(format: "user = %@", userRef)
let predicateTwo = NSPredicate(format: "read = %@", "")
// I want the read field to be empty, which tells me user has not read …Run Code Online (Sandbox Code Playgroud) 斯威夫特 3.1,Xcode 8.3.3
我在 CloudKit 中有一个记录类型,Aircraft它有一个名为 的字段fieldValues,类型为Reference List。
在我的代码中,我有一个aircraftCKRecord 和几个fieldValue作为飞机子代的 CKRecord。
我如何将所有这些fieldValue记录放入aircraft的参考列表中?
创建 aCKReference似乎只允许其中有一条记录:
let reference = CKReference(record: fieldValueRecord, action: .deleteSelf)
Run Code Online (Sandbox Code Playgroud)
但我试图将许多fieldValues连接到单个aircraft. 有任何想法吗?
所以我hava记录包含一个CKReference List字段.
现在我想批量获取所有引用的(通过这个CKReferences列表)记录(来自另一种类型).
有任何想法吗?