2015-04-02 6 views
3

В моем приложении для фитнеса я храню различные значения, которые должны быть доступны во всем приложении в разной степени. цели, max, min, имена классов, fontColors, штрихи, gradientColors и т. д. Поскольку приложение создается во время обучения, я использую сочетание всех вышеперечисленных методов хранения - правильный беспорядок. К, цели переменные (например, 10 000 шагов или целевой вес) представлены во всем приложении и часто используются в коде, но пользователь не меняет их очень часто. Крайне важно, чтобы цели сохранялись и во всех версиях обновлений, поскольку пользователь был бы раздражен, если бы он/она должен был добавить их снова. Какова наилучшая практика для хранения переменных цели, их может быть 20 или около того?NSUserDefault vs Global Variable vs CD vs Singleton - конкретный пример

ответ

2

Общее правило заключается в следующем: информация, которая может быть легко воссозданы должны быть сохранены в памяти, тогда как пользователь вводит информацию/прогресс должен сохраняться где-то.

Основные данные vs NSUserDefaults. Храните основную информацию (например, , String и т. Д.) В NSUserDefaults (это самый простой способ) и сложную информацию (массивы, сложные объекты, отношения объектов) в Core Data (посмотрите на Realm - это лучшая альтернатива Core Data) ,

Глобальная переменная vs Singleton. Глобальные переменные в большинстве случаев являются очень плохими. Они должны принадлежать определенному классу, и при необходимости вы можете создать в нем один синглтон (пример - class AppSettings, который имеет в нем один синглтон и управляет базовыми настройками приложения).

Учитывая, что у вас есть 20 целей, которые могут быть изменены пользователем (поэтому их нельзя воссоздать) Я рекомендую вам использовать CoreData или Realm.

Также обратите внимание на HealthKit - это может быть хорошей идеей для сохранения прогресса пользователя (например, сжигаемых калорий).

+0

Хорошо, знаете ли вы, какие методы хранения могут быстрее получить данные? например, CoreData vs NSUserDefault? Предположим, что я хочу сохранить целевой показатель цели/цели пользователя 100. Как быстро получить данные? – KML

+0

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

+0

Один совет, который я должен вам дать: не хранить изображения в базовых данных - это наверняка даст вам накладные расходы. Используйте 'UIImagePNGRпредставление (изображение) .writeToFile (urlPath, atomically: true)' для хранения изображения и 'let data = NSData (contentsOfFile: cachePathForKey (key)); let image = UIImage (data: data) 'для извлечения. –

1

Первое, что нужно задать себе: что делает мое приложение? Это звучит как приложение для фитнеса, поэтому данные о пригодности должны храниться в вашей модели данных, которая является хранилищем для любых данных, которые соответствуют требованиям бизнес-логики вашего приложения (т. Е. Отслеживают данные о пригодности моих пользователей).

Существует несколько механизмов сохранения, которые люди используют для своих моделей данных, самым простым из которых является хранение ваших данных в словаре, и чтение/запись в файловую систему - это было бы приемлемо для прототипа, но как вы добавляете функции, и ваша модель данных становится более сложной, вам нужно будет рассмотреть NSCoding или CoreData.

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

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

Вот как вы могли бы сделать это с помощью словаря:

class MyDataModel { 

    var goalSteps : Int { 
     get { return dict["goal1"] as? Int ?? 0 } 
     set { dict["goal1"] = newValue } 
    } 

    var goal2 : String { 
     get { return dict["goal2"] as? String ?? "" } 
     set { dict["goal2"] = newValue } 
    } 
    // ... Etc etc ... 

    // Load the data model from a path 
    init(path: String) 
    { 
     dict = NSMutableDictionary(contentsOfFile: path)! 
    } 

    func Save(toPath : String) { 
     dict.writeToFile(toPath, atomically: true) 
    } 

    private var dict = NSMutableDictionary() 
} 
+0

Я специально спрашиваю о переменных цели. – KML

+0

Я обновил свой ответ, чтобы показать быстрый и грязный способ разделить вашу модель данных на свой собственный класс. – joeybladb

+0

Спасибо[email protected] joseph-v-kelly – KML