2012-07-20 17 views
0

我目前正在开发一个voIP应用程序,而且我真的被地址簿卡住了。自定义iOS地址簿。需要关于数据结构和性能的建议

由于定制设计,原生地址簿不适合我的应用程序。此外,我想添加一些额外的数据不在本地通讯录中。但是,这是导致进我已经分成两个部分的一些问题:

1.数据结构:

在我的应用程序的一部分,我需要展现给用户提供所有他的地址簿中的联系人附加信息(例如,如果用户具有相同的应用并且它在线)。

现在我从地址簿api中获取所有信息并直接将其加载到一个数组中(但可通过tableView:cellForRowAtIndexPath:访问),但不显示我正在讨论的自定义信息。我不知道是否值得将所有地址簿信息存储在sqlite数据库中(我可以轻松地添加额外的信息),还是只在文件或其他东西中存储额外的信息。

将数据存储在数据库中的最大问题是联系人的图片足够大以致于无法获得浪费的内存数据库。我以为只存储一个引用(ABRecordID),然后从通讯簿而不是数据库收集相关信息,但Address Book api的Apple文档说ABRecordID不保证保持不变,所以它可能会导致我的数据显示在错误的联系人数据旁边。

有什么想法?

2.性能:

第二个大问题,这个自定义地址簿是... iOS的意见表太“手动”相比Android的那些,例如。您需要将数据存储在某个地方,以便在调用tableView:cellForRowAtIndexPath:方法时返回该数据。你也可以在这个方法中加载这些数据,但这会让它非常慢。

这里的问题是,预先加载内存中的所有数据是很危险的,因为一个人可能有40个联系人或2000个(也可能他/她为他们每个人拍了一张照片,这会消耗更多的内存)。如果iOS设备的内存不足,系统将终止该应用程序。数据库方法没有内存问题,但是要查询每个单元出现的过程非常缓慢,以至于无法接受。

再次,我需要这个想法。无法找到性能和内存消耗之间的折衷。

请不要要求代码,因为我不允许发布它。我真的很感激你的建议。先谢谢你!

+1

您的问题的答案是用SQL支持的Core Data(不是二进制不是XML)。它专为这种类型的应用而设计。 – 2012-07-20 13:01:59

+0

^这。另外,有一个'didReceiveMemoryWarning'方法,UIViewController调用来通知你即将耗尽内存。如果您接近崩溃,请将该方法中的调用放在一些数据中。 – Dustin 2012-07-20 13:31:34

+0

谢谢你们两位! David H,你能告诉我sqlite和Core Data之间的区别吗?因为你说它是专门为这种类型的应用程序设计的? – 2012-07-23 06:11:40

回答

1
  1. 数据结构: 随着recordref,你应该存储名称的电话号码和电子邮件地址。数据存储中没有其他内容。如果三个值中的一个变化,另外两个保持不变则更新已更改的值。 recordref可以在许多用户同时恢复设备的过程中更改,但名称电子邮件和电话不会。如果用户更改名称或电子邮件或电话,他们就赢得了许多用户的同时处理。偶尔你会得到一个与电子邮件和电话不匹配的recordref,联系人可能已经改变了雇主,然后显示一个紧密匹配的列表并要求用户选择一个。

至于有接触的一些1000一个,我会用传呼。将100或200一次加载到当前行显示在表视图中作为数组索引中间的数组中。一旦用户滚动了20-30条记录,就会从地址簿中更新数组中的记录。您将花费大量时间重新保存数据,以便通过比较并试图使其保持最新状态。您应该可以存储多条记录,因为您不需要将用户图像保存在内存中,因为您应该让表视图处理它。获取图像并分配给单元格,当您收到有关要显示的单元格的通知时。即使这样,我也会在加载图像之前稍等一会,因为如果用户快速滚动,则单元格会飞过,并且您会收到通知,单元格滚出并且您可以释放图像数据。如果用户缓慢滚动,那么短暂的等待/睡眠将通过,并且应该为每个单元显示图像。

我不知道你的计划存储在你的应用程序包装联系人多少元,但如果你应该为联系人对象创建两个表,一个具有3-4索引列,将允许更快的查询和第二只有当用户在详细视图中查看联系人时才能保持其余部分。除非你在iPad上,否则不能过多地使用tableviescell。

希望有所帮助。

+0

非常感谢你这样的答案!我会试一试,然后我会来这里报告它是如何去的:D – 2012-07-23 06:10:21

+0

那么它是如何去的?我有兴趣听到你是否成功。您是否为联系人实施了更改检测算法?它在现实生活中有效吗? – 2012-11-16 13:35:31