0

我目前正在开发一个 voIP 应用程序,我真的被地址簿困住了。

由于自定义设计,本机通讯录不适合我的应用程序。此外,我想添加一些本机通讯录中不存在的额外数据。但这会导致一些问题,我将其分为两个部分:

1.数据结构:

在我的应用程序的一部分中,我需要向用户显示他的所有通讯录联系人以及其他信息(例如,如果用户拥有相同的应用程序并且它在线)。

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

将其存储在数据库中的最大问题是联系人的图片很重,以至于导致浪费内存的数据库。我想只存储一个参考(ABRecordID),然后从地址簿而不是数据库中收集相关信息,但是地址簿 api 的 Apple 文档说ABRecordID不能保证保持不变,所以它可能导致我的数据出现在错误的联系人数据旁边。

任何的想法?

2、性能:

这个自定义地址簿的第二个大问题是……例如,与 Android 相比,iOS 表格视图过于“手动”。您需要将数据存储在某处,以便在tableView:cellForRowAtIndexPath:调用该方法时返回该数据。您也可以在此方法中加载该数据,但这会使其非常慢。

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

同样,我需要为此提供一些想法。找不到性能和内存消耗之间的权衡。

请不要要求代码,因为我不允许发布它。我非常感谢您的建议。先感谢您!

4

1 回答 1

1
  1. 数据结构:除了记录引用,您还应该存储姓名电话号码和电子邮件地址。您的数据存储中没有其他内容。如果三个值之一发生变化,而另外两个保持不变,则更新更改的值。在为许多用户恢复设备期间,recordref 可以同时更改,但名称 email 和 phone 不会。如果用户更改了姓名、电子邮件或电话,他们将立即在许多用户中进行更改。偶尔你会得到一个与电子邮件和电话不匹配的记录引用,比如说,联系人可能已经更换了雇主,所以然后显示一个匹配的列表并要求用户选择一个。

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

我不知道您计划在包装联系人的应用程序中存储多少元数据,但是如果您应该为联系人对象创建两个表,一个具有 3-4 个索引列,这将允许更快的查询,第二个用于保存其余的仅当用户在详细视图中查看联系人时才加载。除非你在 iPad 上,否则不能对 tableviescell 投入太多。

希望有帮助。

于 2012-07-20T13:46:44.467 回答