2012-06-14 46 views
0

我使用NSJSONSerialization来解析我的Web服务中的一些JSON,并且我想知道最有效的解决方法。为IOS解析器组织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其中每行的关键是约会日期。这样做效率更高吗?或者我可以同样快速地在NSDictionary对象的NSArray上执行二分搜索吗?如果搜索数组,则有必要在比较谓词中执行[row objectForKey:@"appointmentDate"],这可能是一项昂贵的操作。

回答

1

解析约会和使用像Core Data这样的东西存储它们,在你想要搜索的字段上设置索引?这可能比尝试手动优化和搜索更简单快捷。

虽然如果你想手动做,那么是的,建立一个由你想要搜索的信息键入的排序索引会给你一个更有效的搜索。因此,您可以将自己的字典映射到NSDate(不要以字符串格式保存数据)到该日期的约会集合中,然后您可以对字典的键集执行二进制搜索(确保它首先被正确排序!)来确定在您的搜索间隔内的键的范围。然后你可以进入词典并获取相应的约会。

1

如果约会是按顺序进行的,只需进行二分搜索而不是线性搜索。除非你有成千上万的物品,否则它可能会更快。

但是,花费您很多时间的一件事是重新解析日期。 NSDates的创建速度很慢,所以我建议在您读入列表时将它们创建一次,或者将字符串转换为数值(例如自1970年以来的秒数),这些数值比较快。

+0

你是否认为将字符串转换为日期是值得的,还是应该按照原样比较它们?我使用的是yyyy-mm-dd,它毕竟是一种可排序的格式。 – Trent

+1

字符串可能很好。真的,你想测试一个相当严重的数据集,并查看瓶颈的位置,因为它们并不总是你怀疑的地方。如果您发现您的代码花费大量时间解析和比较字符串,请切换到数字。奇怪的是,在64位Mac OS X上,NSNumbers比在iOS或32位Mac OS X上更快,因为它们大部分时间都将数字打包到对象指针中。 – EricS

相关问题