问题标签 [ckqueryoperation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
772 浏览

cloudkit - CloudKit:删除记录的 CKQueryOperation

有没有一种方法可以在不使用的情况下查询 CloudKit 以获取最近删除的项目(可能来自特定的时间戳)CKFetchRecordChangesOperation?我正在使用公共数据库,所以我不能使用自定义区域(这将是 的要求CKFetchRecordChangesOperation)......所以我需要一种方法来用公共数据库模拟这个。

我希望能够针对 CloudKit 记录中的更改有效地更新我的本地核心数据缓存。当您查询 CloudKit 记录时,CKRecord 似乎有一个creationDateandmodificationDate属性,可以查询该属性以查看最近创建/修改的记录,但这不适用于在 CloudKit 中删除的记录。

这里有什么有效的策略?

0 投票
0 回答
146 浏览

ios - CKQueryOperation 随机出现错误“请求中不存在任何操作”

我正在尝试使用下面的代码片段从云服务器获取一些记录。它在大多数情况下返回没有任何错误的记录:

但有时,它会返回错误:

{
NSDebugDescription = "CKInternalErrorDomain: 1009";
NSLocalizedDescription = "请求中没有操作";
NSUnderlyingError = "错误域=CKInternalErrorDomain Code=1009 \"请求中没有操作\" UserInfo={NSLocalizedDescription=请求中没有操作}";
}

我检查了错误代码,它是CKErrorInvalidArguments,正如文档所说

错误的客户端请求(错误的记录图、格式错误的谓词)

我不知道这个错误是怎么来的以及如何处理这个错误,与错误不同,它对我在一段时间后发送请求CKErrorNetworkUnavailable没有CKErrorRetryAfterKey价值。error.userInfo


顺便说一句,当我收到这个错误时,我的所有操作都会有这个错误,没有返回任何记录。

0 投票
0 回答
223 浏览

swift - CloudKit 按最旧修改记录查询

我正在使用 CloudKit 并尝试通过“modificationDate”来完善记录,但将从最旧的开始填充我的结果限制。例如,如果我在周一、周二、周三、周四创建了 4 条记录,而我只选择其中两条,我将获得周一、周二的记录,而不是周三的周四。下面是我要修复的代码。

}

我认为这就像将NSSortDescriptor升序标记为 false 一样简单。但这不起作用(经过更多测试,我发现这将返回所选字段值为 0 的记录)。

此外,我尝试了一些各种谓词比较无济于事。有什么想法吗?我准备永远放弃 CloudKit。

0 投票
1 回答
531 浏览

ios - CloudKit 中的记录不能超过 100 条

我尝试了许多不同的方法来获取记录并检查了 stackoverflow 上的相同问题,但不能获取超过 100 条记录。

之前,我使用 CKQuery 而不是 CKQueryOperation 来使用resultsLimit参数。

这是我的代码:

0 投票
0 回答
106 浏览

performance - 云套件。第一次连接到容器数据库很慢

我的问题是关于 cloudkit 以及我在运行 CKQueryOperation 从公共数据库中获取记录时的延迟。

我已经进行了很多测试,当然,这只发生在我第一次运行或很长时间没有使用该应用程序时。在这种情况下,当我运行查询时,我必须等待几秒钟才能获取记录。但是,如果我在几秒钟后重复请求(或者如果我取消第一个请求并再次启动它),那么一切都会快速而完美。

cloudkit 是否对已经启动的查询有任何“缓存”,以便下次(短期内)更快?或者有什么关于第一次建立连接然后这个连接保持活动状态的吗?

我真的尝试了很多东西,结果总是一样的。

请问,您对这种行为有任何线索吗?

0 投票
0 回答
567 浏览

swift - CloudKit CKQueryOperation 没有获取所有记录

CloudKit 中的 RecordType 是 100 多条记录。以下代码仅从这 11 条记录中获取,它们不是前 11 条记录,它们是从记录的开头、中心和结尾随机选择的。我无法理解代码中有什么问题。

编辑:我通过将 .reseltsLimit 更改为 5000 来实现它!

0 投票
2 回答
573 浏览

arrays - Swift 谓词仅匹配值数组中的第一个值

我有一个类Download作为CKQueryOperation. 其中一个 inits 允许我使用一组值构建我的谓词:

当我测试它时,query只匹配数组中的第一个值。因此,如果queryValues = [testValue0, testValue1]我有一个字段匹配的记录,testValue0并且我有第二个匹配的记录testValue1,则只会发现第一条记录。如果我切换订单,则另一条记录会被识别。

我可以使用数组创建谓词但只有第一个值匹配,这似乎很奇怪。文档说值是按照它们出现的顺序替换的,但它不应该继续移动到第二个值吗?

对于更多上下文,每条记录都存储在一个单独的数据库中(私有与公共),如果param 为 nil ,我的Download班级会启动两个独立CKQueryOperations的两个都依赖的数据库。无论哪个操作失败,最终都找不到与第一个值匹配的结果,然后在检查第二个值之前放弃。querydatabase

如果需要,我可以包含“下载”的完整代码和失败的单元测试。

0 投票
3 回答
594 浏览

ios - CKError:查询过滤器超出了值的限制:容器为 250

我想从公共数据库中提取大约 500 条“访问”记录。CloudKit 一次只给你 100 条记录,所以我只使用下面的 CKQueryCursor 来获取我想要的所有记录。

我将函数称为:

效果很好,它可以获得我需要的所有访问。控制台日志

但问题是现在我想在按下按钮时刷新,现在它给了我这个错误:

“服务不可用”(6/2022);"请求失败,http 状态码 503"; 30.0 秒后重试

这很不言自明,我想我通过请求微不足道的 500 条记录来压倒服务器?所以我等待 30 秒并再次调用该函数,现在我得到了这个错误。

“超出限制”(27/2023);服务器消息 =“查询过滤器超出了值的限制:容器为 250

由于某种原因,我无法再次运行该功能。如果我重新启动应用程序,它会再次正常工作,但只是第一次。这个问题似乎特定于任何返回 CKQueryCursor 的表。我有其他我正在访问的表少于 100 条记录(因此光标为零),我可以多次提取这些表而不会出现任何问题。

0 投票
0 回答
76 浏览

ckmodifyrecordsoperation - CKQueryOperation 在 CKModifyRecordsOperation 之后

在我的应用程序中,我需要在将自定义区域(~12)写入私有数据库后不久获取所有记录。这些操作都是通过依赖关系同步的。通过 CKModifyRecordsOperation 写入云的数据在仪表板中可见,并通过完成处理程序中的正确结果进行验证。我的问题是 CKQueryOperation 不返回刚刚写入的记录。如果我以某种方式延迟了对 CKQueryOperation 的调用,那么它可以工作。这几乎听起来像是在写入和读取之间存在某种延迟。

我已经查看了所有文档,除了基于操作的依赖机制之外,我看不到同步读取和写入的方法。

我错过了什么?

请帮忙!

拉蒙。

编辑:

您好,我发现更多证据表明使用 CloudKit 时存在一些未确定的延迟。SO 中的一个线程建议拼接记录以避免延迟问题。在我的情况下,“缝合”技术绝对是可能的。因此,我重新编写了代码以利用该技术。而且,基本上,通过避免加载所有记录的需要,完全绕过了延迟。

这是链接:拼接记录

0 投票
0 回答
254 浏览

swift - CloudKit:查询返回部分结果,没有错误

我有某种 CloudKit 索引问题。当我使用 CKModifyRecordsOperation 将记录保存到 iCloud 时,modifyRecordsCompletionBlock 不会返回任何错误。当我使用 NSPredicate(value: true) 或 Dashboard 查询这些记录时,大多数情况下它会丢失一两条记录。

假设我上传了 5 条记录(没有错误),等待一段时间(~15 秒)以确保索引已更新,然后查询它们(通过仪表板或应用程序的 CKQueryOperation)。大多数情况下,它会显示 5 条记录中的 4 条记录。同样,没有错误。记录在 customZone 的 privateDB 中。

奇怪的是:我总是能够通过在“获取”菜单下的仪表板(开发)中手动键入记录名称来获取查询未返回的记录。所以它存储它们,只是不查询。当我删除仪表板中的索引并重新分配它们时,仪表板查询将开始返回所有结果(以前也省略了记录),但是在再上传几次后,查询中又会开始丢失一些结果。

这是我的 CKModifyRecordsOperation:

我尝试了记录字段(最初是日期、资产和参考),试图查看是否有任何字段出现问题。但即使我删除了所有字段(创建一个没有额外字段的记录,只是系统元数据),问题仍然存在。我没有包含 CKQueryOperation 代码,因为 Dashboard 的行为方式与应用程序相同。

有任何想法吗?

编辑:这是我的获取功能的基本内容: