【问题标题】:How to fast enumerate and compare objects of many NSArrays in Objective-C?如何在 Objective-C 中快速枚举和比较多个 NSArray 的对象?
【发布时间】:2012-06-13 13:33:09
【问题描述】:

我有许多不同的NSArray 存储在.dat 文件中,在我的iPhone 应用程序的Documents 文件夹中,如下所示:

john.dat
mary.dat
bob.dat  etc...

.dat 文件的数量是未知的,它会根据与用户对应用程序的操作相关的许多因素而增加或减少。

.dat 文件中存储的这些NSArray's 的内容是什么?它们包含NSString's。重要的是要说 countfor 每个 NSArray 我的变化,就像这样:

john.dat Contains this array of strings:
"Mon, 11 Jun 2012 04:52:06 GMT",
"Tue, 12 Jun 2012 04:51:59 GMT",
"Wed, 13 Jun 2012 04:52:30 GMT",
"Thu, 07 Jun 2012 04:52:00 GMT",


mary.dat Contains this array of strings:
"Mon, 11 Jun 2012 04:52:06 GMT",
"Tue, 12 Jun 2012 04:51:59 GMT",


bob.dat Contains this array of strings:
"Mon, 11 Jun 2012 04:52:06 GMT",
"Tue, 12 Jun 2012 04:51:59 GMT",
"Wed, 13 Jun 2012 04:52:30 GMT",
"Thu, 07 Jun 2012 04:52:00 GMT",
"Fri, 08 Jun 2012 04:51:59 GMT",
"Sun, 10 Jun 2012 04:50:55 GMT"

等等..

我必须定期验证这些NSArray's 中的每个NSString 是否已被修改,以通知用户某些事件。从 Internet 进行 XML 解析后,我已经能够在内存中拥有新的 NSArray's,对应于之前存储在 Documents 文件夹中的相应 .dat 文件。

由于我有很多 .dat 文件,我的问题是:

我如何比较 一次有效地新的NSArray's(NSArray *john, *mary, *bob等等... strong>)我在内存中(由于此 XML 解析),旧的存储在 Documents 文件夹中相应的 john.dat, mary.dat, bob.datetc... 文件中并通知如果NSString's ("Mon, 11 Jun 2012 04:52:06 GMT","Tue, 12 Jun 2012 04:51:59 GMT", etc...) 中的任何一个已被修改,用户?

感谢您的帮助!

【问题讨论】:

  • 为什么不使用 SQLite 或类似的方法来存储数据?
  • 是的,我可以参加 SQLite。感谢您提供宝贵的见解!
  • 与其说是比较本身,但您可以使用FNSubscribeByPath 函数请求在目录中的文件更改时收到通知。那么您就不需要轮询更改了。
  • 不错!我已经在搜索有关 SQLite 的信息了。

标签: iphone objective-c nsstring nsarray fast-enumeration


【解决方案1】:

如果您愿意更改 .dat 文件的格式,您可以计算每个数组内容的哈希值并将其存储在文件的开头。当您获得新数据时,您可以计算其哈希值并将其与存储在文件中的哈希值进行比较。

您选择的哈希函数将决定计算效率,但 I/O 会最小化。

【讨论】:

    【解决方案2】:

    好吧,如果您满足于将数组存储为 .dat 文件(我猜是使用 NSKeyedArchiver),那么 Martin 的答案可能是最好的,并且是经过验证的真实比较方法

    我可能采取的方法是将 NSStrings 存储在 NSDictionarys 而不是 NSArrays 中。然后你可以在它的值上设置一个观察者,所以当从你比较的 XML 文件中提取一个字符串时,如果需要替换并且观察者将被调用,这样你就可以通知用户(如果不熟悉,请参阅NSNotificationCenter 和 KVO) .

    与 .dat 文件相比,将字符串存储在 CoreData 中也可能是有益的(通常是),然后您可以配置 NSFetchedResultsController 来关注您的数据并在获取新数据时执行上述操作。

    【讨论】:

    • 也感谢有用的 cmets,我也在考虑所有这些。
    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多