2012-07-20 39 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