iOS: лучший способ кодировать/декодировать интенсивные объекты памяти
-
27-10-2019 - |
Вопрос
Я довольно новичок в программировании iOS и изо всех сил пытаюсь определить, какой лучший способ кодировать интенсивные объекты памяти, используя протокол NSCODING.
У меня большое количество предметов. Каждый элемент имеет многочисленные изображения в высоком разрешении, связанные с ним. Кроме того, каждый элемент принадлежит элементу, которая может содержать 100 элементов.
Насколько я могу судить, у меня есть пара разных вариантов кодирования:
- Кодировать весь объект ItemCategory
- Устраните класс ItemCategory, создайте только свойство ItemCategory для каждого элемента и просто кодируйте отдельные объекты элемента.
Мне кажется, что № 1 будет расточительно дорогой. Чтобы добавить новый элемент в Itemcategory, мне придется расшифровать всю Itemcategory (что означает декодирование этих сотен изображений, привязанных к элементам, которые он содержит), добавьте элемент, а затем повторно кодируйте все это (Опять же, вместе со всеми этими изображениями).
Но #1 кажется правильным способом сделать это с точки зрения структуры кода. #2 заставляет меня придумать менее интуитивно понятный способ хранения предметов и ассоциации их с их соответствующими элементами.
Если бы я пошел с #1, есть ли способ декодировать только определенные части объектов, чтобы я не получал все эти изображения, которые инициализировались, когда мне на самом деле не нужно их отображать? Одна мысль, которая пришла мне в голову, состоит в том, чтобы на самом деле не кодировать UIImages элемента вместе с самим элементом, а просто имя изображения. Таким образом, изображение будет инициализироваться только при необходимости, и может быть выпущено без выпуска всего элемента, если это так. Я полагаю, что это своего рода подход типа реляционной базы данных.
Я чувствую, что должен быть стандартный способ справиться с такой ситуацией, нет?
Или мой страх перед потреблением памяти необоснован? Возможно, это можно рассматривать как пример «преждевременной оптимизации», но решение, которое я принимаю сейчас, будет глубоко повлиять на структуру данных приложения. Смену с варианта № 1 на #2 вниз по дороге не было бы красивым :)
Решение
Возможно, вы можете использовать Coredata и Persistentstore. Coredata позволяет легко управлять отношениями. Вы можете создавать сущности, которые имеют отношения, которые управляются системой. Таким образом, в вашем случае, возможно, у вас могут быть 3 сущности: категория, элемент и изображения, а также одно и многие отношения между категорией и элементами, а также от одной и многих отношений между элементом и изображениями, что означает, что каждая категория может иметь несколько элементов и каждый элемент имеет несколько изображений, затем, когда вам нужно, вы можете создавать новые изображения и добавить их в конкретный элемент или искать все изображения в элементе.
Я надеюсь, что это было ясно, но Coredata отлично подходит для управления отношениями, и с моделью данных очень легко работать.