草庐IT

ios - 将使用核心数据的 iOS 应用程序同步到云

coder 2023-09-05 原文

我用 Swift 2 编写了一个应用程序,使用 Core Data 进行持久化。我正在考虑添加一项功能以在云中持久化。我已经阅读了 Realm 和 CloudKit 的教程,但还没有看到在 Core Data 之上(或与 Core Data 一起使用)的很好的例子。

我想要:

  • 允许用户输入一次他们的数据,并在他们的所有设备上显示这些数据。
  • 让用户与他们选择的用户同步他们的一些数据。

  • 我可以保留我所有的核心数据逻辑,并在使用 CloudKit(或其他一些框架)的 CRUD 操作期间简单地添加一些服务器调用吗?例如,我使用 NSFetchedResultsController对于我的几个表,在使用 CloudKit 的同时继续使用它是否有意义?

    最佳答案

    CloudKitCoreData不会自动无缝地协同工作,因此您需要自己编写该逻辑。

    different types of iCloud storage options ,其中一两个与 CoreData 无缝集成,但是 CloudKit不是其中之一,而且 CloudKit如果您希望让您的用户与他人共享数据,那么您将需要使用它。

    又名:您将需要自己完成繁重的工作,但如果您使用良好的设计实践,您只需一次完成工作,而无需重写大部分现有代码。

    所以,这里有一些类似于我在使用这两个框架的项目之一中所做的事情:

  • 创建核心数据对象模型和 NSManagedObject像你这样的子类几乎肯定已经有了。
  • 在 Xcode 项目功能中开启 CloudKit 并登录 CloudKit Dashboard
  • 使用 CloudKit Dashboard 设计以 Core Data 实体模型为模型的记录模型
  • (回到 Xcode)在某处创建方法(最方便的是作为 NSManagedObject 子类的扩展)知道如何从 CKRecord 创建给定的 Core Data 对象。 ,并创建一个 CKRecord来自核心数据对象。
  • 创建一个或多个 Swift 类,专门用于处理您的 CloudKit 记录并将它们与 Core Data 同步。这个类将负责在高层执行所有 CloudKit 操作,包括获取、添加、删除、修改等。您可以随心所欲地设计这个公共(public) API(它应该根据您的需要进行定制),但是这class 很可能会使用您在上一步中创建的方法来与 Core Data 类型进行转换。

  • 使用这种方法,您的 CloudKit 专业类(我们称之为 CloudBrain)会完成所有繁重的工作,如果您愿意,您可以在幕后完成所有工作。例如,您可以定义另一个类,SyncBrain ,这将自动监听 Core Data 托管对象上下文中的更改,并在 CloudBrain 上调用相应的方法确保所有更改都与 iCloud 保持同步。它还需要反过来做,监听 iCloud 中的变化并将它们应用到 Core Data。这当然需要最初从 CloudBrain 获取更改。您还需要查看 CKSubscription用于实时更新。

    这种方法的美妙之处在于,如果您正确设置了所有这些,您可以保持所有其他代码相同,因为每次您的其他类与 Core Data 交互时,SyncBrain自动确保 Core Data 中的所有更改都反射(reflect)在 iCloud 中,反之亦然。

    至于与其他用户共享,此功能是iOS 10 中的新功能,似乎Apple 尚未更新CloudKit Quick Start .因此,您应该观看 What's New with CloudKit来自今年的 WWDC。

    重要提示:在 CloudKit Dashboard 中设计记录模型时,请务必遵循 iCloud Design Guide并且没有父记录类型的字段包含子记录类型的数组。这不是很好的表现。相反,将子记录类型定义为具有单个 CKReference指向其父级的字段。这样,如果您需要父级的子级,您可以创建一个查询,请求将父级设置为您想要的父级的所有对象(而不是在您想要的只是等待所有子级下载时) parent )。

    以下是一些 WWDC session 。较旧的 session 仍然包含非常有用的信息,但其中一些已经过时。
  • 2014 – Introducing CloudKit (必须注意正确理解概念)
  • 2014 – Advanced CloudKit
  • 2015 – What's New in CloudKit
  • 2015 – CloudKit Tips and Tricks
  • 2016 – What's New with CloudKit
  • 2016 – CloudKit Best Practices
  • 关于ios - 将使用核心数据的 iOS 应用程序同步到云,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40034803/

    有关ios - 将使用核心数据的 iOS 应用程序同步到云的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    5. ruby - 在 Ruby 中使用匿名模块 - 2

      假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

    6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

      我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

    7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    9. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    10. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    随机推荐