虽不是一行代码,但只需极少的几行代码,你就可以自己编写。例如:
static UIImage FromUrl (string uri)
{
using (var url = new NSUrl (uri))
using (var data = NSData.FromUrl (url))
return UIImage.LoadFromData (data);
}
包括来自 UIImage
的调用,都是线程安全的。
使用新的 await/async 支持,可以执行以下操作:
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");
我尝试了上面的方法,看起来是个好主意,但是我遇到了以下问题:
无法隐式转换类型 System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>
到 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));
}
NSUrl
会抛出异常(在ObjC中返回nil
)。请参阅苹果的文档@https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURL/initWithString:。 - poupou