2013-07-23 8 views

Antwort

50

Kein Einzeiler, aber mit sehr wenigen Linien können Sie Ihre eigenen rollen. Z.B.

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

Die Anrufe, einschließlich der, von UIImage sind threadsicher.

+0

Wenn ich versuche, dies mit einer URL wie https://www.google.ca/images/srpr/logo11w.png I „bekommen könnte für eine Instanz des Typs‚MonoTouch.Foundation nicht initialisiert werden. NSUrl ': Die native Methode' initWithString: 'hat null zurückgegeben. " Irgendeine Idee, warum das passiert? – user2320724

+0

'NSUrl' wird geworfen (gibt' nil' in ObjC zurück), dann ist die angegebene URL ungültig (nicht konform mit RFC 2396). Siehe Apples Dokumentation @ https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURL/initWithString: – poupou

5

Sie möchten sichergehen, dass Sie das Bild asynchron laden, damit Sie den UIhread nicht blockieren. MonoTouch.Dialog enthält eine Klasse ImageLoader (siehe Abschnitt 5.3), die Sie verwenden können.

Es gibt auch ein paar Variationen von UrlImageStore da draußen, async laden Bilder zu helfen.

Schließlich, wenn Sie es manuell tun möchten, gibt es eine Xamarin Recipe, die Sie verwenden können.

27

Mit neuen await/Asynchron-Unterstützung können Sie tun:

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)); 
     } 

und rufen Sie diese mit:

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

byte [] contents = erwarten httpClient.GetByteArrayAsync (imageUrl); – winnicki

1

habe ich versucht, die oben, es sieht aus wie eine gute Idee, aber ich bekommen: kann nicht implizit Typen System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKit.UIImage‘

konvertieren [eine Lösung gefunden] Das Problem war, weil die
obj.Image = Warten Sie das ab. LoadImage (imageUrl) muss auch in einer Methode sein, die als async markiert ist. Dann funktioniert es!

Dank