jjzjj

ios - CloudKit:CKFetchRecordChangesOperation、CKServerChangeToken 和 Delta 下载

coder 2023-09-28 原文

我的问题与 WWDC 2014 Advanced CloudKit 中命名的“Delta Download”有关。

我正在尝试为我的 Core Data 应用程序进行同步,该应用程序目前仅适用于 iPhone(想想:只有一台设备处于事件状态)。因此,基本上,对于目前的大多数情况,该应用程序将从同一台设备将用户记录存储在云中。

我无法理解基于 CKFetchRecordChangesOperation 又名 Delta 下载的自定义区域功能。

正如我所说的那样,我们有 CKServerChangeToken 来维护同步操作(我的意思是只下载那些被另一台设备添加/修改/删除的记录),正如 WWDC 上所展示的那样。 但是,我无法理解的是,我们仅在 CKFetchRecordChangesOperation 之后收到该 token ,当我们将记录保存到云中时,我们没有获得新 token 。

如果我们使用当前可用的 token 进行提取(因为它仅在提取后更改),我们会收到从之前的保存操作中保存的记录。基本上我们得到了我们设备上已有的保存记录。为什么?我在这里遗漏了什么?

如果我们将一些数据(从设备 A)播种到云端会怎么样,这对于设备 B 正在获取区域记录的情况是合理的,但是如果设备 A 呢?重新下载所有记录?

我在 CKRecord 中找到了 recordChangeTag,这是我可以用来解决与本地对象冲突的属性吗 - 获取的对象(相同或不同版本),如果可以的话有人给我举例说明我需要如何执行此操作:在第一次将记录保存到 CloudKit 时将 recordChangeTag 保存到 Core Data 或者如何保存?

缺乏文档真是令人头疼。

最佳答案

我找时间写了这个问题的答案。我不会深入实现,但会讨论这个概念。

CloudKit 提供了一种在您的设备和 CloudKit 服务器之间进行数据同步的方法。 在我的案例中,我仅使用 iPhone 和服务器建立同步过程(同样,如果您有 iPhone + iPad 应用程序,该过程需要更多步骤。):

我在私有(private)云数据库中有自定义区域。 我使用 OperationQueue 来建立相互依赖的不同异步进程。一些操作有自己的操作队列。

步骤:

1) 检查我的自定义区域是否存在

1.1) 如果没有自定义区域

1.2) 创建新的自定义区域。 (可选:添加记录)

1.3) 刷新区域更改 token

You can refresh zone change token by: performing CKFetchRecordChangesOperation, fetchRecordChangesCompletionBlock returns CKServerChangeToken save it to UserDefaults (for example) using NSKeyedArchiver). This operation's task is to refresh token and it's performed at the end synchronisation process.

2) 如果已经有自定义区域

2.1) 使用先前保存的区域更改 token 从区域获取更改。 (CKFetchRecordChangesOperation)

2.2) 更新和删除本地记录。

2.3) 刷新区域更改 token 。

2.4) 检查本地更改(我使用上次云同步时间戳检查之后修改了哪些记录)。

2.5) 上传记录到云包数据库

2.6) 再次刷新区域更改 token 。

我强烈推荐 Nick Harris 文章系列:https://nickharris.wordpress.com/2016/02/09/cloudkit-core-data-nsoperations-introduction/

您会在那里找到实现和设计概念。值得一读。我希望有人会发现所有这些都有帮助。

关于ios - CloudKit:CKFetchRecordChangesOperation、CKServerChangeToken 和 Delta 下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061665/

有关ios - CloudKit:CKFetchRecordChangesOperation、CKServerChangeToken 和 Delta 下载的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  9. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  10. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

随机推荐