2011-10-29 2 views
0

백그라운드 스레드에서 리소스의 그림을 어떻게로드 할 수 있습니까?UI 스레드에서 그림로드 중입니까?

나는 현재이 일을하고 있는데 그것은 꽤 내 UI 물건을 느리게 :

image = [NSData dataWithContentsOfFile:imageName]; 

나는 오히려 백그라운드 스레드에서로드 것입니다.

+2

GCD를 사용하여 그 라인을 감쌀 수 없습니까? –

+0

나는 iOS에 익숙하지 않고 배우는 것에 익숙하지 않다. 예를 들어 주시겠습니까? –

+1

아니라 내가 무엇을 의미하는 것은 또는 당신이 performSelectorInBackground (NSObject의 방법) 나는이 일을 해요 –

답변

5
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
dispatch_async(backgroundQueue,^{ 
    // background process 
    image = [NSData dataWithContentsOfFile:imageName]; 
    dispatch_async(mainQueue,^{ 
    // always update GUI from the main thread 
    // uiimageview.image = image.... etc 
}); 
}); 
+0

를 사용할 수 있지만, 그것은 여전히 ​​UI를 차단의 디스크로부터 5 5메가바이트 JPG를 얻을 5 dataWithContentsOfFile 순차적으로 호출하는거야, 말 JANO했다. 나는 또한 귀하의 솔루션으로 5 대기열에서 분할하여 노력했지만 같은 논리지만 NSOperationQueue와 usig하지만 여전히 둘 다 UI를 차단하고 있습니다. 이 스레드에는 스레드가 많이 있지만 좋은 솔루션을 찾을 수 없습니다. 로컬 자산/파일의 비동기 적 로딩에 대한 문서/참조를 알고 있습니까? – Mat

3

당신은 CGImage를 열려면 CGDataProvider를 사용할 수 있습니다.

예를 들어 CGImageCreateWithPNGDataProvider을 사용할 수 있으며 데이터 제공 업체는 CFURL을 참조합니다. 당신은 CFData 표현에 대해 비슷한 접근법을 사용할 수 있습니다.

그러면 CGImage을 사용하거나 기본 스레드로 되돌아 가서 UIImage 표현을 만들 수 있습니다.

마지막으로 보조 스레드에서 CFData 또는 NSData을로드 한 다음 주 스레드로 돌아가서 무엇인가를 수행 할 수 있습니다.

또한 UIImage는 불변의 유형이며, 어떤 경우에는 캐시를 사용하는 주목할 가치가있을 수 있습니다. 동일한 표현을 여러 번로드하는 경우 해당 최적화를 비활성화하지 않도록하십시오.

관련 문제