草庐IT

ios - 在属性更改时更新标志

coder 2024-01-20 原文

作为我的同步解决方案的一部分,我对特定类的所有对象使用sync status。每当该对象的特定(不是全部)属性发生变化时,我都想更新状态。

我正在考虑四种方法:

  1. 在我更改的任何地方手动设置代码中的状态 需要同步的东西。这是最明显的,但也是 最费力和最容易出错的(我需要记住在添加新功能时也添加同步状态更新)。
  2. 使用核心数据通知(例如 willSaveNSManagedObjectContextObjectsDidChangeNotification)。乍一看这似乎是最合适的—— 我只需在我的 AppDelegate 中注册通知并更新 每次的状态。但是否有可能检查这些变化 并且只在我关心的属性是时更新同步状态 更新?另外,不会设置 sync_status 本身也会触发此通知,导致我陷入无限循环?我将如何解决这个问题?
  3. 我关心的属性的自定义 setter 。我已经有了 之前尝试让它工作时遇到了麻烦,最终决定 尝试单独使用标准核心数据 getter / setter 。但是我 如果它是最合适的,会重新研究。
  4. KVO。我以前没有使用过这种模式,但它可能最容易 只需注册我关心的人的属性更改通知 关于并在那里设置标志。但是我该在哪里做呢?我需要 监控类(class)的每一个对象,所以是否有可能开始观察一个 同一对象的 awakeFromInsert 中属性的 KVO 通知? 即,每当创建一个对象时,立即具有相同的 对象监听 attributeA 的变化并设置它自己的 sync_status 什么时候触发?

以下哪种方法最适合我?也许我遗漏了一些其他想法?

最佳答案

Manually setting the status code

可能是个坏主意,原因与您描述的完全相同。您需要在各种情况下执行此操作。您可能并不总是应用程序的开发者。总有一天你或其他人会忘记它。即使你不这样做,你也会在所有可以集中的地方获得额外的代码。

Track it using a core data notification [...] Also, won't setting the sync_status itself also fires this notification, leading me into an endless loop?

这取决于你怎么做。如果您使用辅助 NSManagedObjectContext,则可以监听 NSManagedObjectContextDidSaveNotification。这样您就可以设置同步标志、保存更改并避免循环,因为您正在保存在您没有观察到的不同上下文中。

使用 NSManagedObjectContextObjectsDidChangeNotification 也可以。这将在对象属性更改但实际上尚未进行保存时发布。检查 userInfo 字典以查看您关心的任何内容是否已更改,如果已更改,请设置您的 sync_status 标志。设置标志会触发一个新的通知,但它是一个你不关心的通知,所以你打破了循环。使用单独的上下文也可以防止在此处循环。

Custom setters on the attributes I care about.

绝对可行,但取决于您关心的属性数量,您最终可能会使用大量访问器来更新同步状态。在您提到的四个中,我会使用这个。

一种相关但更简单的方法是覆盖托管对象类上的 willSave。这将在保存之前被调用。实现它

  1. 查看 [self changedValues] 以查找触发同步的属性。
  2. 如果找到任何一个,请设置同步标志。

这样一来,无论有多少属性最终触发同步标志,每个实体都只有一个自定义方法。

KVO

应该可以工作,但可能不如自定义 setter 直观。

当我不得不做这样的事情时,我将同步信息放在我的数据存储之外。我会监听 NSManagedObjectContextDidSaveNotification,在观察者方法中我会:

  1. 查看 userInfo 以了解发生了什么变化
  2. 获取每个需要同步的对象的 NSManagedObjectID
  3. 将对象 ID 转换为 NSString,并将它们添加到保存在单独文件中的列表中。

同步成功后,我会清除对象 ID 列表。

当时的想法主要是同步标志是比实际模型数据更多的元数据,所以我将其保留在模型之外。如果您希望将其保留在模型中,我会选择覆盖 willSave

关于ios - 在属性更改时更新标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946992/

有关ios - 在属性更改时更新标志的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  6. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  7. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  8. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  9. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  10. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

随机推荐