2016-12-28 13 views
0

Мне нужно сохранить массив пользовательских объектов из сеанса в сеанс для пользователя. Массив будет заполнен 1-14 достаточно простыми и легкими пользовательским быстрыми объекты, как так:Кэш-массив пользовательских объектов в Swift3

[Obj1, Obj2, Obj3] 

То, что я хочу сделать, это когда viewWillDisappear называется, сохраняется эти данные, так что, когда пользователь возвращается к экрану , Я могу снова использовать эти точные объекты. Каков наилучший способ сделать это? Я изучил использование основных данных, но я не хочу настраивать модель данных для этих объектов, просто хранить их, как без каких-либо отношений или чего-то еще.

Обратите внимание: приложение использует очень вычислительный алгоритм налогообложения, из которого эти объекты играют центральную роль. Таким образом, мне нужно, чтобы эти объекты были как можно более легкими. Поэтому я не хочу, чтобы объекты соответствовали NSCoding, поскольку нет необходимости в центральной роли объекта

+1

«Обратите внимание, что по различным причинам эти объекты не подходят для хранения в NSUserdefaults». Мне было бы интересно услышать их, потому что это было бы моим решением для решения – Alexander

+2

Вы можете использовать NSCoding + NSKeyedArchiver – Moritz

+0

Использовать 'NSCoding', см. Аналогичный подход здесь: [Написание быстрого словаря в файл] (http: // stackoverflow .com/q/27197658/2415822) – JAL

ответ

2

Если сделать ваш класс класса Objective-C, что соответствует NSCoding оказывается на самом деле оказывает существенное влияние на производительность (я скептически), то вы можете сделать второй контейнер, который подкласс NSCoding, который используется исключительно для хранения. Добавьте инициализатор в ваш текущий легкий класс Swift/struct, который инициализирует экземпляр из этого объекта контейнера и наоборот. Каждый раз, когда вам нужно сериализовать/десериализовать, вы просто используете этот объект-контейнер в качестве промежуточного.

Это покупает вам функциональность с минимальными затратами при чтении/записи, но не влияет на регулярное использование.

+0

Как добавить еще один слой поверх «NSCoding», повысить производительность? Я не уверен, что понимаю, почему это можно сделать. – sbooth

+0

@sbooth Объективные классы C всегда используют динамическую отправку. Компилятор не может встраивать какие-либо методы, обрезать неиспользуемый код или делать какие-либо оптимизации, требующие поиска вызовов «в». – Alexander

+0

@sbooth См. Так: https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/ – Alexander

0

Если вы можете сделать объект подклассом NSObject, то вы можете привести его в соответствие с NSCoding и используйте NSKeyedArchiver и NSKeyedUnarchiver для сериализации и десериализации ваших объектов.

+0

См. Мой ответ Александру выше. –