2014-01-16 3 views
0

UIImageView 개체를 백그라운드로로드하는 것이 안전합니까? 완료되면 주 스레드의보기 계층 구조에 개체를 삽입 하시겠습니까?백그라운드에서 UIImageView 개체를로드하는 방법은 무엇입니까?

예를 들어 백그라운드에서 10 개의 이미지 뷰를로드하는 GCD 블록을 만듭니다. 마지막으로 비동기 블록을 사용하여 모든 UIImageViews을보기 계층에 추가합니다.

UIImage을 작성하여 UIImageView에 추가하면 UIImageView에 이미지 데이터가 필요할 때로드됩니다. 내가 어떻게 UIImage 데이터가 백그라운드에서 끌어 당겨 져서 긴 로딩 시간 동안 주 스레드를 차단하지 못하게 할 수 있습니까?

+0

이미지를 다운로드하고 있습니까? 그들은 이미 디스크에있다? 성능 문제 (특히)가 있습니까? – Wain

+0

'uiimageView' 대신 [Asyncronous image view] (https://github.com/nicklockwood/AsyncImageView)를 시도하십시오. –

답변

1

서버에서 이미지를 다운로드하는 경우 별도의 스레드에서 다운로드하므로 UI가 차단되지 않는 것이 좋습니다. 이미지 다운로드가 완료되면 기본 스레드에서 특정 이미지보기로 설정할 수 있습니다.

__weak typeof(self) weakSelf = self; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) { 
     NSData *imageData= [NSData dataWithContentsOfURL:Image_URL]; 
     UIImage *image = [UIImage imageWithData:imageData]; 

     dispatch_sync(dispatch_get_main_queue(), ^(void) { 
      __strong __typeof__(weakSelf) strongSelf = weakSelf; 
      strongSelf.someImageView.image = image; 
      ; 
     }); 
    }); 

참고 : 당신이 AFNetworking를 사용하는 경우, 다시 다운로드하려는 경우가에서 해당 이미지를 가져올 것이다, 그래서 그것을 캐시 할 수 있습니다 또한 UIImageView 범주를 사용할 수 있으며 백그라운드에서 로딩 이미지 헨델하고 은닉처.

+0

GCD 블록에서 __weak self를 사용할 필요가 있습니까 ?? – johnMa

+0

개념 상 보존주기가 생성되지 않습니다. 블록이 생성되면 그 환경을 포착합니다. 수단은 사용되는 모든 객체에 대한 강력한 참조를 만듭니다. 우리가 약자를 사용하는 이유는 레티안 사이클을 얻을 수있는 기회입니다. 또한 우리가 블록에 있고 다른 참조가 남아 있지 않으면 우리의 약한 자아는 무효가 될 것입니다. 왜냐하면 우리는 블록을 측면에서 강하게 만듭니다. 또한 사용하기 전에 nil을 확인해야합니다. –

관련 문제