Подтвердить что ты не робот

UIImage загружен из URL-адреса в Xamarin/С#

Прошло 4 года с тех пор, как на этот вопрос ответил этот пост в блоге.

Есть ли стандартный способ создания UIImage с изображением из URL? Что-то вроде:

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

Я чувствую, что, вероятно, я пропустил что-то очень простое.

4b9b3361

Ответ 1

Не один лайнер, но с очень небольшим количеством строк вы можете катиться самостоятельно. Например.

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

Вызовы, в том числе один из UIImage, являются потокобезопасными.

Ответ 2

С новой поддержкой 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");

Ответ 3

Вы хотите быть уверены, что загрузите асинхронный образ, чтобы не блокировать поток пользовательского интерфейса. MonoTouch.Dialog включает ImageLoader (см. Раздел 5.3), который вы могли бы использовать.

Существует также несколько вариантов UrlImageStore, чтобы помочь с асинхронной загрузкой изображений.

Наконец, если вы хотите сделать это вручную, есть рецепт Xamarin, который вы можете использовать.

Ответ 4

Я попробовал вышесказанное, это отличная идея, но я получаю: Невозможно неявно преобразовать тип System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKit.UIImage '

[найдено решение] Проблема была в том, что obj.Image = ожидание this.LoadImage(imageUrl) также должен быть в методе, отмеченном async. Тогда это работает!

Спасибо