2012-02-13 9 views
2

내 앱은 다른 앱 인스턴스간에 콘텐츠를 공유 할 수 있습니다. 즉, 이메일에 문서를 첨부하고 다른 사용자에게 전송할 수있는 버튼이 있습니다. 그들이이 파일을 받으면 앱의 인스턴스에서 열립니다. 이것은 모두 작동합니다.iOS 주소록을 효율적으로 검색하는 방법

그러나이 데이터 파일을 가져 오는 동안 전자 메일 주소가 이미 주소록에있는 경우가 아니면 주소록 레코드를 주소록에 추가해야합니다. 그러면 ABRecordRef를 반환해야합니다.

는 좀 더 효율적으로하는 방법을 결정해야합니다

A - 루프의 이름을 지정하고 (I가 필요로하는 모든입니다) 이메일 주소와 ABRecordRef와 사용자 정의 객체의 배열을 만드는 전체 주소록을. 그런 다음 앱이 첨부 파일 XML을 읽을 때마다이 NSArray를 매번 확인해야합니다.

B - 첨부 파일 XML에서 연락처를 발견하고 이메일 주소를 기반으로 검색 할 때마다 주소록에 액세스하십시오. ABAddressBookCopyArrayOfAllPeople

다른 아이디어?

+0

예를 들어 NSDictionary를 사용하고 전자 메일 주소를 키로 사용 하시겠습니까? – TheLearner

+0

왜 직접 테스트하지 않습니까? 이러한 유형의 질문에 대한 이론적 인 대답은 모든 미지를 고려하지 못하기 때문에 부족한 경향이 있습니다. – mydogisbox

+0

비록 누군가가이 경험을 가지고 있지만 그것은 시간을 절약 할 수 있지만, 내가 듣는다. 또한 사람들의 주소록이 얼마나 큰지 누가 아는 지 테스트하는 것도 어렵습니다. – TheLearner

답변

3

참고 : 전자 메일 주소로 검색 할 때 적용됩니다. 이름으로 검색하는 경우에는 적용되지 않습니다.

고정 크기의 주소 수를 검색하는 임의의 크기의 주소록의 경우 주소록 검색 속도가 빨라집니다. 이는 모든 주소를 해시에 넣는 초기 비용이 책의 주소 수와 관련하여 적어도 선형 (O(n)) 시간을 취하는 반면 (주소록은 최소한 보통 효율성이 있다고 가정) 조회가 이루어져야하기 때문입니다 검사 할 주소의 수가 고정되어 있기 때문에 구현에 따라 로그 (O(ln(n)) 또는 일정한 시간 (O(x))이 표시됩니다.

편집 : 주소록 api에 대한 간략한 조사에 따르면 단순히 "주소록 검색"만 할 수 없다는 것을 보여 주므로 복사 한 다음 필터링해야합니다.

기록 식별자를

주소록 데이터베이스의 모든 레코드를 사용하여 고유 레코드 식별자가 있습니다. 이 식별자는 레코드가 삭제되거나 MobileMe 동기화 데이터가 재설정되지 않는 한 항상 동일한 레코드를 참조합니다. 레코드 식별자는 스레드간에 안전하게 전달 될 수 있습니다. 기기간에 동일하게 유지되는 것은 아닙니다.

특정 레코드에 대한 장기 참조를 유지하는 권장 방법은 식별자 외에 이름과 성 또는 해시의 해시를 저장하는 것입니다. ID로 레코드를 검색 할 때 레코드 이름을 저장된 이름과 비교하십시오. 일치하지 않으면 저장된 이름을 사용하여 레코드를 찾은 다음 레코드의 새 ID를 저장하십시오.

레코드의 레코드 식별자를 가져 오려면 ABRecordGetRecordID 함수를 사용하십시오. 식별자로 사람 레코드를 찾으려면 ABAddressBookGetPersonWithRecordID 함수를 사용하십시오. 식별자로 그룹을 찾으려면 ABAddressBookGetGroupWithRecordID 함수를 사용하십시오. 이름으로 개인 레코드를 찾으려면 ABAddressBookCopyPeopleWithName 함수를 사용하십시오. 있는 NSDictionary에 주소록을 복사 아이폰 OS에서 주소록의 한계를 감안할 때

+0

[ABAddressBookCopyPeopleWithName] (https://developer.apple.com/library/ios/#documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html#//apple_ref/c/func/ABAddressBookCopyPeopleWithName)은 먼저 복사본을 만듭니다. – Karoh

+1

그가 사실 이름을 검색하지 않는다는 것을 제외하고는 전자 메일 주소로 검색 중이며 전자 메일 주소로 사람을 검색 할 수있는 방법이 없습니다. – mydogisbox

1

빠른 때마다 검색하는 것보다 될 것입니다.

전자 메일 주소 충돌을 덮어 쓰는 것이 좋다고 가정하면 전자 메일 주소를 키로 사용하고 ABRecordRef를 개체의 NSNumber로 저장 한 사전을 만듭니다.

배경 대기열에서이 모든 작업을 수행 한 다음 주소록 변경 사항을 모니터링하고 필요에 따라 사전을 다시로드합니다.

주소록에 수천 개의 항목이있는 사용자가 발생했습니다. 이러한 경우 레코드 개체를 만들어 핵심 데이터에 저장할 수 있습니다. 마지막으로 수정 한 날짜를 필터링하여 해당 레코드의 전자 메일 주소를 업데이트할지 여부를 결정할 수 있습니다.

관련 문제