2016-08-04 5 views
0

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

Это выглядит следующим образом:

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. Есть ли проблема с этим? Думал, что это может даже ускорить загрузку некоторых из наших списков, потому что они не захватывают изображения и не обрабатывают их цвет снова и снова.

ответ

0

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

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

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

+0

Изображения используются во всем приложении, как и в одно изображение несколько раз, даже на том же экране. Сейчас он окрашивает изображение снова и снова, в случае списка. Я не знаю, оптимизирует ли ios это, используя одно и то же изображение, или если он каждый раз захватывает изображение с диска ... Я бы предпочел пожертвовать небольшим объемом памяти для изображения для повышения производительности – aufty

+1

, если это случай, лучший подход, на мой взгляд, был бы следующим: создать синглтон, каждый раз, когда будет доступна только одна обработка изображений, как только изображение будет готово, сохраните его в словаре <Цвет, UIImage>, в следующий раз, когда singlton будет запущен будет искать этот образ, если он существует, возьмите его - иначе, создайте новый. Таким образом, у вас всегда будут только данные, которые вы используете по требованию, а не только для создания различных изображений, таких как рулетка. – Tomerz

1

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

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

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

Некоторые примеры кода:

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; 
    } 
} 
Смежные вопросы