2013-07-23 20 views

Odpowiedz

50

Nie jest to jeden liniowiec, ale z bardzo małą liczbą linii można przetaczać własne. Na przykład.

static UIImage FromUrl (string uri) 
{ 
    using (var url = new NSUrl (uri)) 
    using (var data = NSData.FromUrl (url)) 
     return UIImage.LoadFromData (data); 
} 

Wezwania, w tym jeden z UIImage, są thread-safe.

+0

Kiedy próbuję to z url takich jak https://www.google.ca/images/srpr/logo11w.png otrzymuję „Nie można zainicjować instancję typu„MonoTouch.Foundation. NSUrl ': natywna metoda "initWithString:" zwróciła zero. " Masz pomysł, dlaczego tak się dzieje? – user2320724

+0

'NSUrl' rzuci (zwróci' nil' w ObjC), a podany adres URL jest nieprawidłowy (nie zgodny z RFC 2396). Zobacz dokumentację Apple's documentation @ https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURL/initWithString: – poupou

5

Chcesz mieć pewność, że załadujesz obrazek asynchronicznie, aby nie blokować wątku interfejsu użytkownika. MonoTouch.Dialog zawiera klasę ImageLoader (patrz sekcja 5.3), której możesz użyć.

Dostępne są również różne warianty UrlImageStore, które pomagają w asynchronicznym ładowaniu obrazów.

Wreszcie, jeśli chcesz zrobić to ręcznie, możesz użyć Xamarin Recipe.

27

Dzięki nowej pomocy Oczekujcie/asynchroniczny można zrobić:

public async Task<UIImage> LoadImage (string imageUrl) 
     { 
      var httpClient = new HttpClient(); 

      Task<byte[]> contentsTask = httpClient.GetByteArrayAsync (imageUrl); 

      // await! control returns to the caller and the task continues to run on another thread 
      var contents = await contentsTask; 

      // load from bytes 
      return UIImage.LoadFromData (NSData.FromArray (contents)); 
     } 

i nazywają to z:

someYourUIImageObjectOnUI.Image = await this.LoadImage ("some image url"); 
+3

bajt [] contents = poczekaj na httpClient.GetByteArrayAsync (imageUrl); – winnicki

1

Próbowałem powyżej, wygląda na to świetny pomysł, ale pojawia się: nie można niejawnie przekonwertować typu System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKit.UIImage”

[znalazł rozwiązanie] problem polegał ponieważ
obj.Image = poczekaj na to.LoadImage (imageUrl) musi być również w metodzie oznaczonej async. To działa!

Dzięki