2013-05-23 3 views
1

내 앱에서 여러 개의 이미지를 다운로드해야하며 이미지는 60kb입니다.빠른 이미지 다운로드

나는 이것에 대해 진행되고있는 방법은 다음과 같습니다

image.Image = UIImage.LoadFromData (NSData.FromUrl (new NSUrl("http://url"))); 

이 작동하지만 이미지를 다운로드 데 예상보다 시간이 오래 걸린다. 내가 알지 못하는 이것에 관해 더 잘/더 빠른 방법이 있습니까?

이미지 다운로드가 ViewDidLoad() 방법으로 발생하여이보기 컨트롤러에 연결하기 전에 오래 동안 일시 중지가 발생합니다.

+0

대신 UIWebView를 사용해 보셨습니까? 그냥 보여주는 경우? 그게 내가 페이스 북 사용자 이미지와 함께 내 애플 리케이션에서 사용하는 그게 ... 그 예쁜 snappy. –

답변

2

MonoTouch.Dialog에는 이미지의 배경 로딩을 처리하는 ImageLoader (초 5.3) 클래스가 포함되어 있으며 "실제"이미지를 다운로드하는 동안 기본 이미지를 할당 할 수 있습니다. 반드시 더 빠를 필요는 없지만 사용자에게보다 반응 적이어야합니다.

image.Image = ImageLoader.DefaultRequestImage(new Uri(uriString), this) 

@poupou 노트에 따르면, 두 번째 인수는 IImageUpdated를 구현하는 클래스에 대한 참조 여야합니다.

// Show a "waiting/placeholder" image until the real one is available 
image.Image = ... 
UIImage img = null; 
// Download the images outside the main (UI) thread 
ThreadPool.QueueUserWorkItem (delegate { 
    UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true; 
    using (NSUrl nsurl = new NSUrl (url)) 
    using (NSData data = NSData.FromUrl (nsurl)) { 
     UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false; 
     // we might not get any data, e.g. if there's no internet connection available 
     if (data != null) 
      img = UIImage.LoadFromData (data); 
    } 
    // finally call the completion action on the main thread 
    NSRunLoop.Main.InvokeOnMainThread (delegate { 
     // note: if `img` is null then you might want to keep the "waiting" 
     // image or show a different one 
     image.Image = img; 
    }); 
}); 

도움이 될 또 다른 것은 당신이 (예를 들어 오프라인 모드)를 다운로드 이미지를 캐시하는 것입니다 -하지만 :

+0

'this'는 코드가 작동하도록'IImageUpdated'를 구현해야합니다. – poupou

+0

'ImageLoader'를 사용하여 기본 이미지를 설정하는 방법이 있습니까? 아니면 다운로드를 요청하기 전에 수동으로 설정해야합니까? – Deekor

1

같은 API를 사용하여 (내가 가진 몇 가지 코드에서 적응) 신속하고 더러운 방법이 될 것이다 귀하의 신청서에는 불가능할 수도 있습니다.

그런 경우 먼저 캐시에 이미지가 있는지 확인하고 다운로드 한 후에 저장하지 않는지 확인하십시오 (백그라운드 스레드에서 완료 됨).

+0

'InvokeInBackground()'에'ThreadPool'을 사용하면 어떤 이점이 있습니까? – Deekor

+1

Xamarin.iOS를 사용하면 대부분의 * 기본 * 기능에 대해 .NET과 기본 API 중에서 선택할 수 있습니다. 이 경우 어떤 중요한 성능 차이도 기대하지 않습니다 (병목 현상은 네트워크 다운로드 일 것입니다). Usage (API)는'ThreadPool'은'System.Object' 매개 변수를 받아들이는'WaitCallback' 델리게이트를 사용하는 반면, NSAction 델리게이트는'NSAction' 델리게이트를 가지지 않습니다. 유용 할 수 있습니다 (그러나 여기서는 사용되지 않았습니다). 'ThreadPool은 또한 더 많은 크로스 플랫폼이지만 코드는 이미 매우 iOS (그리고 OSX)에 특화되어있다. – poupou