Должен ли я использовать общедоступные статические поля для изображений и цветов?

У меня есть публичный статический метод, который возвращает замененное изображение (я передаю черное изображение, и оно возвращает то же изображение с красным вместо черного или любым другим цветом, который я выберу).

Это выглядит так:

public class ColorImage
{
    public static UIImage GetColoredImage(UIImage image, UIColor color)
    {
        UIImage coloredImage = null;
        if (color == null)
        {
            color = UIColor.FromRGB(44, 132, 248);
        }

        UIGraphics.BeginImageContextWithOptions(image.Size, false, UIScreen.MainScreen.Scale);
        using (CGContext context = UIGraphics.GetCurrentContext())
        {
            context.TranslateCTM(0, image.Size.Height);
            context.ScaleCTM(1.0f, -1.0f);

            var rect = new RectangleF(0, 0, (float)image.Size.Width, (float)image.Size.Height);

            context.ClipToMask(rect, image.CGImage);
            context.SetFillColor(color.CGColor);
            context.FillRect(rect);

            coloredImage = UIGraphics.GetImageFromCurrentImageContext();
            UIGraphics.EndImageContext();
        }
        return coloredImage;
    }
}

Я разговаривал с коллегой, и мы подумали, что может быть лучше хранить изображения (цветные, а не цветные), а также цвета, которые мы планируем использовать в нашем приложении в общедоступных статических полях. Таким образом, если бы мне нужно было использовать один из этих цветов или изображений, я мог бы просто позвонить:

Textfield.BackgroundColor = ColorCache.MainColor;
Textfield.Image = ImageCache.UserImage;

Или что-то вдоль этих линий. Это для iOS-приложения, использующего Xamarin. Есть ли проблема с этим? Я подумал, что это может даже заставить некоторые наши списки просмотра загружаться быстрее, потому что они не захватывают изображения и не обрабатывают цвета на них снова и снова.

2 ответа

Вместо того, чтобы загружать все сразу, как в статике, лучше использовать кэширование. Таким образом, загруженное изображение будет сохранено в памяти и не будет создано при следующем запросе. Но изображение, которое еще не задано, не будет занимать память.

Вы можете использовать обычные свойства или статические свойства.

Или создайте личный словарь только для чтения с именем цвета и изображением в качестве ключа и значения. Если ключ доступен по запросу, верните его, а затем создайте, добавьте в словарь и верните изображение.

Пример кода:

public static class ColorImage
{
    private static readonly Dictionary<UIColor, UIImage> _colorDictionary = new Dictionary<UIColor, UIImage>();

    public static UIImage GetColoredImage(UIImage image, UIColor color)
    {
        if(_colorDictionary.ContainsKey(color))
        {
           _colorDictionary.TryGetValue(color, out image);
        }
        else 
        {
            //create the image
            _colorDictionary.Add(color, image);
        }
        return image;
    }
}

Я думаю, что нет смысла загружать ненужные данные в память. то, что вы намереваетесь сделать, это создать изображение для каждого цвета, о котором вы можете подумать, и если пользователь выберет этот конкретный цвет, он будет готов к использованию.

если вы строили серверный модуль, это была бы немного другая перспектива, но пока один пользователь выбирает цвет, и единственное, что вам нужно сделать, это нарисовать его, какой смысл инициализировать массив изображениями?

это просто взорвет вашу память за шанс, что пользователь может выбрать этот цвет..

Другие вопросы по тегам