Должен ли я использовать общедоступные статические поля для изображений и цветов?
У меня есть публичный статический метод, который возвращает замененное изображение (я передаю черное изображение, и оно возвращает то же изображение с красным вместо черного или любым другим цветом, который я выберу).
Это выглядит так:
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;
}
}
Я думаю, что нет смысла загружать ненужные данные в память. то, что вы намереваетесь сделать, это создать изображение для каждого цвета, о котором вы можете подумать, и если пользователь выберет этот конкретный цвет, он будет готов к использованию.
если вы строили серверный модуль, это была бы немного другая перспектива, но пока один пользователь выбирает цвет, и единственное, что вам нужно сделать, это нарисовать его, какой смысл инициализировать массив изображениями?
это просто взорвет вашу память за шанс, что пользователь может выбрать этот цвет..