web-dev-qa-db-ja.com

Xamarin / C#のURLから読み込まれたUIImage

this questionthis blog post で回答されてから4年が経ちました。

URLの画像を使用してUIImageを作成する標準的な方法はありますか?何かのようなもの:

UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");

本当にシンプルなものが欠けているように感じます。

25
Jason Hartley

ワンライナーではありませんが、ごく少数のラインで独自のロールを作成できます。例えば。

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

UIImageからの呼び出しを含む呼び出しは、スレッドセーフです。

56
poupou

新しい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");
27
Pavel Sich

UIスレッドをブロックしないように、必ず非同期イメージをロードしてください。 MonoTouch.Dialogには、使用できる ImageLoader (セクション5.3を参照)クラスが含まれています。

画像の非同期読み込みに役立つ rlImageStore のバリエーションもいくつかあります。

最後に、手動で行う場合は、 Xamarin Recipe を使用できます。

5
Jason

上記を試してみましたが、素晴らしいアイデアのように見えますが、タイプSystem.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' toMonotouch.UIKit.UIImageを暗黙的に変換できません

[解決策を見つけた]問題は
obj.Image = await this.LoadImage(imageUrl)も、asyncとマークされたメソッド内になければなりません。その後、動作します!

ありがとう

1
Scott Emick