Хранение данных в приложении Swift iOS для последующего использования

Я пишу приложение для iOS на Swift, и приложение собирает пользовательский ввод с нескольких экранов приложения, а на последнем экране он должен отправлять информацию, собранную на сервер через API.

Теперь мой вопрос: как лучше всего управлять собранными данными в приложении? Должен ли я использовать plist для сохранения данных формы? У него также есть одно изображение, которое я хочу загрузить на свой сервер с последнего экрана. Как мне это сделать?

PS: я также читал о http://developer.apple.com/CoreData, но я не уверен, что это правильный путь вперед.

Любое предложение приветствуется.


person Nagendra Rao    schedule 31.08.2015    source источник
comment
Используйте NSUserDfault. Вы можете преобразовать изображение в данные, потому что NSUserDfault поддерживает только объекты сериализации, такие как строка, nsnumbers, nsdata, nsdate и т. д.   -  person Blind Ninja    schedule 31.08.2015
comment
А еще лучше просто сохранить потом на диск, использовать каталог документов. Вы можете сохранить массив на диск напрямую, если убедитесь, что все содержащиеся объекты соответствуют требованиям NSCoding. Ставить его в NSUserDefaults не очень хорошая идея, он предназначен для небольших данных настроек. Не изображения.   -  person rckoenes    schedule 31.08.2015
comment
@rckoenes Сохранить на диск, как я создаю файл xml или json (для сохранения переменных) и png/jpeg для сохранения изображений?   -  person Nagendra Rao    schedule 31.08.2015
comment
Вы также можете просто сохранить отверстие NSArray на диск. Прочтите Руководство по программированию архивов и сериализаций   -  person rckoenes    schedule 31.08.2015
comment
Я сделал что-то подобное, просто сделал текстовый файл и сохранил его в документах. CoreData и NSUserDefaults слишком хардкорны для такого типа вещей.   -  person TurtleFan    schedule 31.08.2015


Ответы (1)


ОБНОВЛЕНИЕ: чтобы сэкономить ваше время - это решение Swift 1.2. Я не тестировал его на Swift 2 (вероятно, нужно обновить поток secureValue)

Похоже, вы говорите о данных/профиле пользователя (поправьте меня, если я ошибаюсь), для такого объема данных использование NSUserDefault вполне нормально.

Для пользовательских настроек (если это так!!) Я бы использовал что-то вроде диспетчера предпочтений:

import Foundation
import Security

class PreferencesManager {

    class  func saveValue(value: AnyObject?, key: String) {

        NSUserDefaults.standardUserDefaults().setObject(value, forKey: key)
        NSUserDefaults.standardUserDefaults().synchronize()

    }
    class  func loadValueForKey(key: String) -> AnyObject? {
        let r : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey(key)
        return r

    }

    class  func saveSecureValue(value: String?, key: String) {
        var dict = dictForKey(key)
        if let v = value {
            var data: NSData = v.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
            (SecItemDelete(dict as NSDictionary as CFDictionary))
            dict[kSecValueData as NSString] = v.dataUsingEncoding(NSUTF8StringEncoding,
                allowLossyConversion:false);
            var status = SecItemAdd(dict as NSDictionary as CFDictionary, nil)
        } else {
            var status = SecItemDelete(dict as NSDictionary as CFDictionary)
        }
    }

    class  func loadSecureValueForKey(key: String) -> String? {
        var dict = dictForKey(key)
        dict[kSecReturnData as NSString] = kCFBooleanTrue
        var dataRef: Unmanaged<AnyObject>?
        var value: NSString? = nil
        var status = SecItemCopyMatching(dict as NSDictionary as CFDictionary, &dataRef)
        if 0 == status {
            let opaque = dataRef?.toOpaque()
            if let op = opaque {
                value = NSString(data: Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue(),
                    encoding: NSUTF8StringEncoding)
            }
        }

        let val :String? =  value as? String
        return val
    }

    class private func dictForKey(key: String) -> NSMutableDictionary {
        var dict = NSMutableDictionary()
        dict[kSecClass as NSString] = kSecClassGenericPassword as NSString
        dict[kSecAttrService as NSString] = key
        return dict
    }

}

Вы можете использовать PreferencesManager.saveSecureValue для защищенных данных (например, пароль и т. д.) и PreferencesManager.saveValue для остальных значений.

person Eugene Braginets    schedule 31.08.2015
comment
Он похож на профиль пользователя, но больше похож на приложение, которое создает, скажем, 100 профилей в день. Это не просто информация профиля пользователя. - person Nagendra Rao; 31.08.2015
comment
Я просто хочу, чтобы данные хранились на устройстве до тех пор, пока не будет сделан последний вызов API. Как только это будет сделано, мне больше не нужны данные. - person Nagendra Rao; 31.08.2015
comment
Нет, тогда не в этом дело: я бы пошел тогда с записью в файл в папке «Документы». В случае NSDictionary - просто напишитеToFile. Также здесь есть несколько хороших советов: файл">stackoverflow.com/questions/27197658/ - person Eugene Braginets; 31.08.2015