2014-10-25 2 views
2

스레드 문제가 발생하지 않고 백그라운드 스레드에서 UIImage를로드 할 수 있습니까? 최선의 방법은 무엇입니까? 나는이 내가 지금 그것을 할 방법입니다 아이폰 OS 8을 사용하지 해요 :백그라운드에서 UIImage로드 스레드

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
    dispatch_async(backgroundQueue, ^{ 
     UIImage *image = [UIImage imageNamed: fileName]; 

     // only update UI on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self setImage: image]; 
     }); 

    }); 
+0

현재의 예가 무엇입니까? –

+0

백그라운드에서 이미지를로드 할 때 한 번 CG ImageIO 오류가 발생하여 그 이유가 궁금했습니다. 여기 사람들은 UIImages를 백그라운드로로드해서는 안되며 그것을 수정해야한다고 말했습니다. – Max

+0

아마도'imageWithContextOfURl'이 도움이 될 것입니다. url 대신 ur'nsbundle'의 경로를 url로 지정하십시오. http://stackoverflow.com/questions/4962561/set-uiimageview-image-using-a-url –

답변

10

은 당신이하고있는 것은 구조적으로,하지만 난 imageNamed:가 스레드 안전 여부를 알 수없는 - 그리고 나는 더이 그것이 있다고 믿는 이유. 설명서에서 다르게 언급하지 않는 한, 항상 이 아니라 스레드 안전하다고 가정해야합니다.

당신은이 방법은 스레드 안전하다는 것을 가정 할 수 없다 :이 경우,하지documentation specifically says입니다.

필자는이 작업을 수행해야하는지 여부를 자문해야합니다. imageNamed:에는 걱정되는 부분을 해결하는 캐싱 메커니즘이 포함되어 있습니다. 어쨌든 조기 최적화는 시간과 지력의 낭비입니다. 여기에 문제가 있습니까? 알아낼 악기를 사용하십시오; 직감이나 본능을 사용하지 마십시오.

이미지가 너무 크고 형식이 잘못 선택되어서 문제가 발생하는 경우 - 예를 들어 매우 큰 JPEG를 사용하는 경우 - 을 수정하는 것이 좋습니다.

EDIT iOS 9 설명서에는 "iOS 9 이상에서는이 방법이 스레드로부터 안전합니다."라고되어 있습니다. 이것은 제 대답이 옳았으며 문제가 해결되었음을 알려줍니다.

+1

빠른 응답을 보내 주셔서 감사합니다. imageNamed로 캐싱이 있다는 것을 알지만 첫 번째로드에는 시간이 걸립니다. 배경에 무거운 이미지를로드하는 중입니다.로드가 완료되면 표시하기를 원하므로 사용자는 전혀 지연을 볼 수 없습니다. – Max

+0

죄송합니다. 그건 의미가 없습니다. 시간이 걸리면 지연이 생기고 배경 스레드에서'imageNamed :'를 호출하기 때문에 지연이 마술처럼 제거되지는 않습니다. 나는 당신에게 왜 지연이 있는지 스스로에게 묻고 있어야한다고 생각합니다. 이미지가 너무 커서로드하는 데 오랜 시간이 걸리는 경우 이미 심각한 문제가 있습니다. 표시 할 수있는 것보다 큰 이미지를로드하는 지점은 전혀 없습니다. 시간, 메모리 및 처리 능력을 낭비합니다. 표시 할 수있는 이미지보다 크지 않은 이미지는 특히'png '인 경우로드하는 데 시간이 많이 걸리지 않습니다. – matt

+5

내가 보았던 것은 - [UIImage imageNamed :]'_used_는 thread-safe ...가 iOS 8이 될 때까지였습니다. 그 이후로 나는 배경 스레드에서 호출함으로써 발생하는 많은 충돌을 보았습니다. 문제없이 수년간 해왔습니다. – DarkDust

관련 문제