2012-01-08 5 views
3

관심있는 연락처를 찾기 위해 주소록 데이터를 읽을 필요가있는 앱을 쓰고 있습니다. 앱은 요즘 (Viber, Whatsapp, Tango ...와 같이) 할 수 있습니다. 나는 데이터를 서버에 보내고 클라이언트에 응답하여 연락처에 동일한 앱이 장치에 설치되도록 일치 작업을 수행해야합니다.주소록을 다른 앱처럼 빨리 읽는 법 (Viber, Whatsapp ...)

나는 논리 또는 아이디어의 메커니즘에 아무 문제가 없다, 내 문제는 속도이다! 내가 원하는 것을 할 수 있었지만 iPhone4에서 500 초가 걸린 27 초가 걸렸습니다. 동일한 기기에서 Viber 또는 Whatsapp (또는 유사한 앱)을 시도하면 프로세스가 5 초 이내에 완료됩니다.

내 방법은 매우 간단합니다. for 루프를 수행하고 모든 것을 읽습니다. 다른 앱처럼 어떻게 똑같은 일을 할 수 있습니까?

//variable definitions 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); 
    CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault, CFArrayGetCount(people), people); 

    //sort the contents of the Mutable Array 
    CFArraySortValues(peopleMutable, CFRangeMake(0, CFArrayGetCount(peopleMutable)), (CFComparatorFunction) ABPersonComparePeopleByName, (void*) ABPersonGetSortOrdering()); 

    //read the Address Book 
    NSString *fullName, *number; 
    ABRecordRef record = ABPersonCreate(); 
    ABMutableMultiValueRef multi; 
    int contactID; 
    int nameCount=0;//used to count the names in the string to send to server 
    NSMutableString *strNamesToSend = [[NSMutableString alloc] init]; 

    for(CFIndex i=0; i< CFArrayGetCount(people); i++) 
    { 
     record = CFArrayGetValueAtIndex(people, i); 
     multi = ABRecordCopyValue(record, kABPersonPhoneProperty); 

     //Contact ID 
     contactID = (int)ABRecordGetRecordID(record); 

     //Full Name 
     fullName = [NSString stringWithFormat:@"%@ %@", (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty), (NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty)]; 
     fullName = [fullName stringByReplacingOccurrencesOfString:@" (null)" withString:@""]; 

     //fill data into AddressBook Table 
     if(dbOpen == SQLITE_OK) 
     { 
      //pure sqlite3 work to save the names in my app 
     } 

     //Get multiple numbers from each user (if any) 
     for(CFIndex j=0; j<ABMultiValueGetCount(multi); j++) 
     { 
      number = (NSString *)ABMultiValueCopyValueAtIndex(multi, j); 

      nameCount++; 

      //fill data into AllNumbers Table 
      if(dbOpen == SQLITE_OK) 
      { 
       //another sqlite3 work to save the numbers 
      } 
     } 

     //send to the server every 29 numbers so we don't send all the 500 numbers at once 
     if(nameCount > 29) 
     { 
      //send to server 
     } 
+0

시간을 어디에서 사용했는지보기 위해 프로파일을 만들었습니까? 데이터를 서버에 동 기적으로 보내시겠습니까? –

답변

5

당신이 모든 코드를 프로파일 링 시도 유무 : 여기

내가 사용하는 코드이다? 프로파일 러는 코드의 느린 부분을 신속하게 식별 할 수 있어야합니다.

간단한 검사에서 한 번만 반복하지 않고 반복 할 때마다 배열 크기를 계산합니다. 루프 밖으로 이동 :

int count = CFArrayGetCount(people); 
for (CFIndex i = 0; i < count; i++) 

당신은 SQL 당신이 만들고있어 호출하지만 당신이 SQLITE_OK 확인하고있는 사실은 당신이 루프를 통해 데이터베이스 매번 개방하고 있음을 의미한다 상세를하지 않습니다. 이 경우 매번 데이터베이스를 열지 않고 루프 외부로이 호출을 이동해야합니다.

나는 nameCount이 리셋 중이 지 않다는 것을 알았습니다. 즉, 29에 도달하면 if case가 매번 공격을 받아 엄청난 수의 네트워크 요청이 발생합니다.

+0

배열 밖에서 카운트를 이동하고 SQLITE_OK 문제를 제거해 봅니다. 변수 nameCount가 재설정되지만 코드 게시를 최소화하기 위해이 부분을 생략했습니다. 마지막 if 문에서 재설정됩니다. 나는 프로파일 러가 무엇인지 이해하지 못한다고 생각합니다. 나는 새로운 순간에 새 시간을 들여서 당신을 업데이트 할 것이고, 고마워. – antf

+0

그런데, 나는 아주 기본적인 것이기 때문에 나는 데이터베이스 부분을 생략했다. 그러나 그것이 필요하다면 나는 그것을 게시 할 것이다. – antf

+0

나는 당신이 제안한 변화를 시도했지만 여전히 27 초가 걸렸다. – antf

관련 문제