2012-02-13 46 views
2

我的應用程序能夠在應用程序的不同實例之間共享其內容,即有一個按鈕可讓我將文檔附加到電子郵件並將其發送給應用程序的另一個用戶。當他們收到這個文件時,它會在他們的應用程序實例中打開。這一切都工作。如何有效地搜索iOS地址簿

但是,在導入這個數據文件的過程中,我需要應用程序將地址簿記錄添加到地址簿中,除非電子郵件地址已經存在於地址簿中,否則它只能返回ABRecordRef。

我需要決定哪種方法更有效:

A - 遍歷整個地址簿中創建用戶定義的對象與姓名和電子郵件地址(這是所有我需要)和ABRecordRef的數組。然後,當應用程序正在讀取附件文件XML時,它必須每次檢查此NSArray。

B - 每次遇到附件XML中的聯繫人並根據電子郵件地址搜索它時訪問地址簿。 ABAddressBookCopyArrayOfAllPeople

還有其他想法嗎?

+0

所以你的意思爲如使用NSDictionary並將電子郵件地址作爲密鑰? – TheLearner 2012-02-13 17:35:33

+0

爲什麼不自己測試一下呢?對這類問題的理論答案往往是缺乏的,因爲他們無法考慮所有未知因素。 – mydogisbox 2012-02-13 17:38:33

+0

我聽到你的聲音,但是如果有人有這方面的經驗,它會節省時間。也很難測試誰知道一些人的地址簿有多大。 – TheLearner 2012-02-13 17:40:25

回答

3

注意:這適用於通過電子郵件地址進行搜索。如果您按名稱搜索,則不適用。

對於要查找的地址數量固定的任意大小的地址簿,搜索地址簿會更快。這是因爲將所有地址放入哈希中的初始成本保證至少相對於本書中的地址數量呈線性(O(n))時間,同時(假設地址簿至少適度高效)查找應該是取決於實施方案,因爲您有固定數量的地址要檢查,所以要麼是對數(O(ln(n))要麼是恆定時間(O(x))。

編輯: 對地址簿API的簡要調查顯示,您不能簡單地「搜索地址簿」,您必須複製並過濾它。

使用記錄標識

在通訊簿數據庫的每條記錄都有一個唯一的記錄標識符。此標識符始終指向同一條記錄,除非該記錄被刪除或MobileMe同步數據被重置。記錄標識符可以在線程之間安全傳遞。他們不保證在不同設備上保持不變。

對特定記錄保持長期引用的推薦方法是除標識符之外還存儲名字和姓氏,或名字和姓氏的散列。當您通過ID查找記錄時,將記錄名稱與您的存儲名稱進行比較。如果它們不匹配,請使用存儲的名稱查找記錄,並存儲記錄的新ID。

要獲取記錄的記錄標識符,請使用函數ABRecordGetRecordID。要按標識查找人員記錄,請使用ABAddressBookGetPersonWithRecordID函數。要通過標識符查找組,請使用函數ABAddressBookGetGroupWithRecordID。要按名稱查找人員記錄,請使用ABAddressBookCopyPeopleWithName函數。

+0

[ABAddressBookCopyPeopleWithName(https://developer.apple.com/library/ios/#documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html#//apple_ref/c/func/ABAddressBookCopyPeopleWithName)看起來像它可以在沒有搜索首先製作副本。 – Karoh 2013-07-30 16:56:07

+1

的確如此,除了他不按姓名搜索,他正在通過電子郵件地址進行搜索,並且沒有辦法通過電子郵件地址檢索人員。 – mydogisbox 2013-07-30 17:10:39

1

鑑於iOS中地址簿的侷限性,將地址簿複製到NSDictionary中將比嘗試每次搜索更快。

假設你是罰款的方式覆蓋在電子郵件地址衝突,我想創建一個字典的電子郵件地址作爲存儲爲的NSNumber的對象鍵和ABRecordRef。

我會做這一切的背景隊列,然後監視地址簿更改並重新加載字典根據需要。

我們遇到了用戶在他們的地址簿幾千項。在這些情況下,您可能需要創建一個記錄對象並將其存儲在Core Data中。通過過濾最後修改日期,您可以確定是否更新給定記錄的電子郵件地址。