2013-04-09 2 views
0

recordID를 기반으로 사람의 ABAddressBook 속성에 액세스하려고 시도 할 때마다 속성을 가져 오려고 할 때마다 널값을 얻습니다.알 수있는이 블록의 실행 완료

이것은 내가 시도한 코드입니다.

ABAddressBookRef addressBook = NULL; 
    addressBook = ABAddressBookCreateWithOptions(addressBook, nil); 
    ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, (ABRecordID) [[object valueForKey:@"recordId"] description]); 
    NSString *firstName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
    NSLog(@"First Name %@", firstName); 
    NSString *lastName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 
    NSString *name = [NSString stringWithFormat:@"%@" "%@", lastName, firstName]; 
    NSLog(@"Full Name %@", name); 

여기서 내가 뭘 잘못하고 있니?

편집 : 위의 문제를 파악했습니다. 이것이 내가 사용한 것입니다. 지금 문제는이 코드 블록이 실행 완료 될 때만 UITableView를 다시로드해야한다는 것입니다. 그러나이 블록이 언제 실행을 완료하는지 알아낼 수는 없습니다. 도움이 필요하다.

CFErrorRef myError = NULL; 
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &myError); 
ABAddressBookRequestAccessWithCompletion(addressBook, 
             ^(bool granted, CFErrorRef error) { 
              if (granted) { 

               ABRecordID recID = [recordId intValue]; 

               ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, recID); 
               NSString *firstName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 

               NSString *lastName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 
               if(!firstName){ 
                firstName = @""; 
               } 
               if(!lastName){ 
                lastName = @""; 
               } 

               NSString *name = [NSString stringWithFormat:@"%@ %@", lastName, firstName]; 
               if([firstName length] < 1 && [lastName length] < 1){ 
                name = @"No Name"; 
               } 
               self.personName = name; 
               NSData *imageData = (NSData *)CFBridgingRelease(ABPersonCopyImageData(person)); 
               if(imageData){ 
                self.personImage = [UIImage imageWithData:imageData]; 
               } 
               else{ 
                self.personImage = [UIImage imageNamed:@"default.png"]; 
               } 

               NSMutableArray *array = [NSMutableArray array]; 
               [array addObject:self.personName]; 
               [array addObject:self.personImage]; 

               [self.personDetailsArray addObject:array]; 
               [self.tableView reloadData]; 

              } else { 
               // Handle the error 
              } 
             }); 

블록 내부의 UI 요소를 업데이트하는 중 올바른 방법은 무엇입니까? 그렇지 않으면 대체 무엇입니까.

내가 갖고 싶은 것은 내 UITableView가 블록 실행 후에 만로드/업데이트되도록하는 것입니다. 아직 도움이되는 것이 없습니다.

+0

'사람'개체가 처음에 유효한 개체입니까? –

+0

아니요 사람 개체가 유효하지 않습니다. 하지만 내가 뭘 잘못하고있어? –

답변

0

주소록을 잘못 작성했다고 생각합니다.

ABAddressBookRef addressBook = ABAddressBookCreate(); 

첫 줄에 NULL을 선언 할 필요가 없으므로이를 제거하십시오. 그런 다음 person 개체를 가져 와서 올바른 참조를 반환하는지 확인하십시오.

또한, 나는 다음과 같이 ABAddressBookCreateWithOptions이 매개 변수를 가지고 있다고 생각합니다 :

ABAddressBookRef ABAddressBookCreateWithOptions (
    CFDictionaryRef options, 
    CFErrorRef* error 
); 

대신 옵션 당신은 주소록에 대한 참조를 전달하고 있습니다. 나는 ABAddressBookCreateWithOptions을 가진 운이 많지 않았다 그래서 나는 다만 ABAddressBookCreate를 사용한다. iOS 6에서는 더 이상 사용되지 않지만 그 점은 저에게있어 큰 문제가 아닙니다.

+0

xcode는 IOS6에서 ABAddressBookCreate()가 더 이상 사용되지 않는다고 말합니다. –

+1

'ABAddressBookCreateWithOptions (NULL, NULL) '을 시도하십시오. –

+0

예. 맞았 어. 하지만 문제는 내 DB에있는 recordID를 ABRecordID로 캐스팅하는 것이 었습니다. –