0

我正在使用NSJSONSerialization从我的 Web 服务中解析一些 JSON,并且我想知道最有效的布局方式。

目前我以这种格式生成 JSON:

[
  {"title":"title Val","description":"description val","appointmentDate":"2012-06-16T00:00:00"},
  {"title":"title Val","description":"description val","appointmentDate":"2012-06-16T00:00:00"},
  {"title":"title Val","description":"description val","appointmentDate":"2012-06-16T00:00:00"}
]

解析器构造一个NSArray其中每个元素都是一个NSDictionary包含约会详细信息(标题、描述、日期)的元素。

现在我的应用程序实际上需要在解析的 JSON 中搜索日期在某个时间间隔之间的约会,以便它可以根据某些用户操作显示它们。目前我只是扫描数组并检索任何符合条件的约会。这当然是 O(n)。当我想在特定字段上搜索时,我应该以不同的方式表示我的 JSON 吗?也许像这样?

{
  "2012-06-16T00:00:00" : {"title":"title Val","description":"description val"},
  "2012-06-18T00:00:00" : {"title":"title val","description":"description val"},
  "2012-06-20T00:00:00" : {"title":"title val","description":"description val"},
}

这样,解析器将生成NSDictionary每行的键是约会日期的位置。这样做是否更有效,或者我可以同样快速地对一个对象NSArray执行二进制搜索?NSDictionary如果搜索了数组,则有必要[row objectForKey:@"appointmentDate"]在比较谓词中执行 a,这可能是一项昂贵的操作。

4

2 回答 2

1

如果约会是有序的,只需进行二分搜索而不是线性搜索。除非您有数以万计的项目,否则它可能会足够快。

不过,可能会花费您大量时间的一件事是重新解析日期。NSDates 的创建速度很慢,因此我建议您在读入列表时创建一次,或者将字符串转换为数值,例如自 1970 年以来的秒数,这可以快速进行比较。

于 2012-06-15T00:03:43.853 回答
1

如何解析约会并使用 Core Data 之类的东西存储它们,并在要搜索的字段上设置索引?这可能比尝试手动优化和搜索更简单、更快。

虽然如果您想手动进行,那么可以,建立一个以您要搜索的信息为关键字的排序索引将为您提供更有效的搜索。因此,您可以让您的字典将NSDate's(不要以字符串格式保存数据)映射到该日期的约会集,然后您可以对字典的键集执行二进制搜索(确保它是首先正确排序!)以识别落在搜索间隔内的键范围。然后您可以进入字典并获取相应的约会。

于 2012-06-15T00:03:54.157 回答