2013-07-23 41 views

回答

50

不是一句话,但只有很少几行你可以自己推出。例如。

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

这些调用包括UIImage中的调用都是线程安全的。

+0

当我尝试这一个URL,例如https://www.google.ca/images/srpr/logo11w.png我得到“无法初始化类“MonoTouch.Foundation的一个实例。 NSUrl':原生的'initWithString:'方法返回nil。“任何想法为什么会发生? – user2320724

+0

'NSUrl'会抛出(在ObjC中返回'nil'),那么提供的URL是无效的(不符合RFC 2396)。请参阅Apple的文档@ https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURL/initWithString: – poupou

5

你想确保你加载的图像异步,以便你不会阻止你的UI线程。 MonoTouch.Dialog包含您可以使用的ImageLoader(参见5.3)类。

这里还有UrlImageStore的一些变化,以帮助异步加载图像。

最后,如果您想手动执行此操作,则可以使用Xamarin Recipe

27

有了新的await /异步支持,你可以这样做:

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

,你调用此方法:

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

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

1

我尝试了上面,它看起来像一个伟大的想法,但我得到: 无法隐式转换类型System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKit.UIImage”

[找到了解决办法] 问题是因为
obj.Image =等待this.LoadImage(imageUrl) 也必须在标记为async的方法中。 然后它的工作!

感谢