2013-07-23 8 views

risposta

50

Non una battuta, ma con poche righe si può rotolare il proprio. Per esempio.

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

Le chiamate, compreso quello da UIImage, sono thread-safe.

+0

quando provo questo con un URL come https://www.google.ca/images/srpr/logo11w.png ottengo "Impossibile inizializzare un'istanza del tipo 'MonoTouch.Foundation. NSUrl ': il metodo nativo' initWithString: 'restituito nil. " Qualche idea del perché questo accada? – user2320724

+0

'NSUrl' getterà (restituisce' nil' in ObjC) quindi l'URL fornito non è valido (non conforme a RFC 2396). Consulta la documentazione di Apple all'indirizzo https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURL/initWithString: – poupou

5

Si desidera essere sicuri di caricare l'immagine async in modo da non bloccare il thread dell'interfaccia utente. MonoTouch.Dialog include una classe ImageLoader (vedi sez. 5.3) che è possibile utilizzare.

Esistono anche un paio di varianti di UrlImageStore per agevolare il caricamento asincrono delle immagini.

Infine, se si desidera eseguire manualmente, è possibile utilizzare uno Xamarin Recipe.

27

Con il nuovo supporto await/asincrona si può fare:

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

e chiamare questo con:

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

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

1

ho provato quanto sopra, sembra una grande idea, ma ottengo: Impossibile convertire implicitamente il tipo System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKit.UIImage'

[trovato una soluzione] il problema era perché il
obj.Image = attendi this.LoadImage (imageUrl) deve anche essere in un metodo contrassegnato come asincrono. Quindi funziona!

Grazie