2010-12-08 3 views
3

저는 UITableView의 연락처에서 축소판 이미지를 표시하는 iPhone 응용 프로그램에서 작업하고 있습니다.UITableView - 게으른 로딩 연락처 이미지

축소판을 켜기 전까지는 모든 것이 매우 빠르며 스크롤하는 데 시간이 많이 걸리게됩니다. 다른 모든 데이터는 코어 데이터에 의해 뒷받침되며 코어 데이터에 이미지를 미리 저장해 봤지만 실행 자체가 너무 오래 걸리고 유연성이 떨어집니다.

정말 필요한 방법은 lookup과 prep thumbnails를 별도의 스레드 또는 NSOperation 등으로 지연 시키지만,이 작업을 수행하는 가장 간단한 방법은 무엇인지 모르겠습니다.

Apple의 샘플 프로젝트 LazyTableImages는 웹에서 이미지를 가져온 경우 환상적입니다. 물론 적응하기가 어려울 수 있습니다. 근본적으로 문제는 같지만 다운로드와 네트워크 대기 시간 등의 시간 지연 대신 사용자의 주소록에있는 그림을 조회하는 데 걸리는 시간입니다. 간단하고 우아한 방법으로 이러한 목표를 달성하기 위해 어떤 도움이 조언 코드가 사람에게

 UIImage *contactImage = nil; 
     if (ABPersonHasImageData(person)) { 

     NSData *contactImageData = (NSData*)ABPersonCopyImageData(person); 
     UIImage *tempContactImage = [UIImage imageWithData:contactImageData]; 
     [contactImageData release]; 

     UIGraphicsBeginImageContext(CGSizeMake(45.0f, 45.0f));    
     [tempContactImage drawInRect:CGRectMake(0.0f, 0.0f, 45.0f, 45.0f)];   
     contactImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     } 

큰 감사 :

내가 동시에 할 필요가 내 테이블 셀의 서브 클래스에서 작업입니다.

답변

1

이미 UIImage가있는 경우 contactImage를 그릴 필요가있는 이유는 무엇입니까? tempContactImage를 직접 사용할 수도 있습니다.

좋은 시작은 간단하게이 작업을 수행하는 것입니다 :

cell.imageView.image = tempContactImage 

편집 :

방법에 대해 : 즉 (가있을 수 있습니다) 아직 고르지 있다면

ABPersonRef person = ...get person... 
UITableViewCell * cell = ...get cell... 
[ [ NSOperationQueue mainQueue ] addOperation: 
    [ NSBlockOperation blockOperationWithBlock:^{ 
     if (ABPersonHasImageData(person)) { 
     ... 
     } 
     cell.imageView.image = contactImage ; 

    } ] ; 

당신이 대기열 수 백그라운드 스레드에서 테이블 뷰에 적용해야하는 이미지는 테이블 뷰가 스크롤을 멈출 때까지 기다린 다음 보류중인 이미지 변경 사항을 적용하십시오.

+0

당신이 contactImage로 그리는 경우 단지, 45.0x45.0에 맞게 확장 할 수있는 당신은 또한 단지와 할 cell.imageView.contentMode = UIViewContentModeScaleAspectFill – nielsbot

+0

ABPersonCopyImageData (사람 위의 코드를 사용할 수 있습니다); CFDataRef imageData = ABPersonCopyImageDataWithFormat (사람, kABPersonImageFormatThumbnail); –

+0

고마워,하지만 방금 사용하는 경우 : ABPersonCopyImageData (person); 당신은 그 크기가 무엇이든간에 전체 크기의 연락처 이미지를 얻을 것입니다. 실제로 특정 형식의 연락처 이미지가있는 사용자의 iPhone 앱에서 테이블보기가 충돌합니다. 새롭고 훨씬 안전한 하위 메모리 함수를 사용해야합니다. CFDataRef imageData = ABPersonCopyImageDataWithFormat (person, kABPersonImageFormatThumbnail); –

1

이 방법을 사용하십시오. kABPersonImageFormat * 미리 *

(NSData*)ABPersonCopyImageDataWithFormat([targetPeople objectAtIndex:index], kABPersonImageFormatThumbnail)