是否有一种标准方法可以使用来自 URL 的图像创建 UIImage?就像是:
UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");
我觉得我可能错过了一些非常简单的东西。
不是单行,但您可以自己滚动几行。例如
static UIImage FromUrl (string uri)
{
using (var url = new NSUrl (uri))
using (var data = NSData.FromUrl (url))
return UIImage.LoadFromData (data);
}
这些调用,包括来自 的调用,UIImage
都是线程安全的。
使用新的等待/异步支持,您可以:
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");
您要确保异步加载图像,以免阻塞 UI 线程。MonoTouch.Dialog 包含一个您可以使用的ImageLoader(参见第 5.3 节)类。
还有一些UrlImageStore的变体可以帮助异步加载图像。
最后,如果您想手动操作,可以使用Xamarin 食谱。
我尝试了上述方法,这看起来是个好主意,但我得到:无法隐式转换类型System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to
Monotouch.UIKit.UIImage'
[找到解决方案] 问题是因为
obj.Image = await this.LoadImage (imageUrl) 也必须在标记为 async 的方法中。然后它起作用了!
谢谢
下面的代码应该可以工作,
public static async Task<UIImage> LoadImage(string imageUrl)
{
var httpClient = new HttpClient();
var contents = await httpClient.GetByteArrayAsync(imageUrl);
return UIImage.LoadFromData(NSData.FromArray(contents));
}