鉴于 ABRecordID 可以在云同步之间以及在我无法控制的其他情况下发生变化,我如何维护对 IOS 通讯簿记录的长期引用?
Apple 提供以下指导:
“保留对特定记录的长期引用的推荐方法是,除了标识符之外,还存储名字和姓氏,或者名字和姓氏的哈希值。当您通过以下方式查找记录时ID,将记录的名称与您存储的名称进行比较。如果它们不匹配,则使用存储的名称查找记录,并为记录存储新的 ID。”
但是我不明白这个指南。如果地址簿中可以有重复的名字,并且由于用户可以修改记录中的名字,这个建议怎么会起作用?
例如,如果用户修改地址簿记录的名称,我的例程将无法通过 ABRecordID 找到它,所以如果我认为通过我存储的名称哈希进行搜索,我无法找到重复的名称而不是新的 ABRecordID对于我之前引用的那条特定记录?
最后,获得 IOS AddressBook 记录的长期引用的最佳方法是什么?如果上述建议确实有效,我还缺少什么?
最佳答案
最稳健(但并非完全故障安全)的方法是提出 ABRecord 字段的优先级排序,并从该列表中尽可能多地存储可用的 ABRecordID,并将其存储到您自己的(散列的)私有(private)记录格式中.检索私有(private)记录时(或在其他方便的时间),您可以验证私有(private)记录是否与 ABRecord 匹配,并通过一系列后备检查来确保其准确无误。
示例优先级排序:
检索记录时,您可以先匹配ABRecordID。如果没有返回任何结果,您可以搜索 FirstName + LastName。然后,您可以将这些结果与 PhoneNumber... 等进行匹配。通过这种方式,您可以区分 2 个 Bob Smiths,因为他们可能有不同的电话号码(或者一个人可能没有电话号码)。当然,根据您的优先级列表的长度,此机制将越强大。
最后的手段是提示用户区分 2 个具有全新 ABRecordID 的 Bob Smiths,他们的记录在其他方面是相同的——毕竟,这样一个不方便的提示会比允许用户联系错误的 Bob Smith(正如我所说,这将是最后的手段)。
但是,此 AB 解决方案可能涉及一些同步问题。
对于使用过 iOS Media Player 的任何人来说,这是一个熟悉的问题。具体来说,用户音乐库中的 MPMediaItems 有一个属性 MPMediaItemPropertyPersistentID,文档将其描述为:
The value is not guaranteed to persist across a sync/unsync/sync cycle.
换句话说,PersistentID 不保证是持久的。解决方案包括对 MediaItem 属性进行类似的回退检查。
关于iphone - 保持对 IOS AddressBook 条目的长期引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14763688/
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我
如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta
假设我有一个可枚举对象enum,现在我想获取第三个项目。我知道一种通用方法是转换成数组,然后使用索引访问,如:enum.to_a[2]但这种方式会创建一个临时数组,效率可能很低。现在我使用:enum.each_with_index{|v,i|breakvifi==2}但这非常丑陋和多余。执行此操作最有效的方法是什么? 最佳答案 你可以使用take剥离前三个元素,然后剥离last从take给你的数组中获取第三个元素:third=enum.take(3).last如果您根本不想生成任何数组,那么也许:#Ifenumisn'tanEnum
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby有很大不同。由于我与ruby之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?
代码:threads=[]Thread.abort_on_exception=truebegin#throwexceptionsinthreadssowecanseethemthreadseputs"EXCEPTION:#{e.inspect}"puts"MESSAGE:#{e.message}"end崩溃:.rvm/gems/ruby-2.1.3@req/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:478:inload_missing_constant':自动加载常量MyClass时检测到循环依赖稍加研究后,
我正在跟踪我们的应用程序(ruby2.1)中的内存泄漏问题。我正在使用这两种技术:ObjectSpace.dump_all将所有对象转储到JSON流,然后进行离线分析。我使用的第二种技术是使用ObjectSpace.reachable_objects_from进行实时分析。在这两种方式中,我发现我泄漏的对象被一个对象RubyVM::Env引用。任何人都可以向我解释什么是RubyVM::Env。如何删除这些引用? 最佳答案 RubyVM::Env是一个包含变量引用的内部ruby类。这是我的测试:require'objspace'a
这个问题不是很有用因为themethodreferenceoperatorwasremovedfromRuby2.7.0发布前。由于历史原因,这个问题被搁置了。Ruby2.7.0-preview1引入了方法引用运算符.:作为实验性功能。(更多here和here)。有一些抽象示例可用于说明如何使用这个新运算符:method=42.:to_s=>#method.receiver=>42method.name=>:to_smethod.call=>"42"和:method=File.:read=>#method.call('/Users/foo/.zshrc')=>"exportZSH=$H
在我的应用程序中我有classUserincludeUser::FooendUser::Foo定义在app/models/user/foo.rb现在我正在使用一个定义了自己的Foo类的库。我收到此错误:warning:toplevelconstantFooreferencedbyUser::FooUser仅引用具有完整路径的Foo,User::Foo,而Foo实际上从来没有指的是Foo。这是怎么回事?更新:才想起我之前遇到过同样的问题,在问题1中看到这里:HowdoIrefertoasubmodule's"fullpath"inruby? 最佳答案
我想通过JSON获取Wikiquote页面的结构化版本(基本上我需要所有短语)示例:http://en.wikiquote.org/wiki/Fight_Club_(film)我试过:http://en.wikiquote.org/w/api.php?format=xml&action=parse&page=Fight_Club_(film)&prop=text但我得到了所有HTML源代码。我需要每个pharse作为数组的一个元素我如何使用DBPEDIA实现这一目标? 最佳答案 首先,我不确定您是否可以使用DBpedia查询wiki