2015-08-31 2 views
1

Я пишу приложение iOS в Swift, и приложение собирает пользовательский ввод с нескольких экранов приложений, а на последнем экране он должен ПОЧТАТЬ информацию, собранную на сервер через API.Хранение данных в приложении Swift iOS для последующего использования

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

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

Любое предложение очень ценится.

+1

Использование NSUserDfault. Вы можете преобразовывать изображение в данные, потому что NSUserDfault поддерживает только объекты сериализации, такие как string, nsnumbers, nsdata, nsdate и т. Д. –

+0

Лучше всего просто сэкономить на диске, используйте каталог документов. Вы можете сохранить массив на диск напрямую, если убедитесь, что весь объект содержит 'NSCoding'. Ввод его в «NSUserDefaults» - это не очень хорошая идея, это касается небольших данных настроек. Не изображения. – rckoenes

+0

@rckoenes Сохранить на диск, как в я создаю файл xml или json (для сохранения переменных) и png/jpeg для сохранения изображений? – Rao

ответ

1

UPDATE: чтобы сэкономить ваше время - это решение 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 для остальной части значения

+0

Схож с профилем пользователя, но больше для приложения, которое создает, скажем, 100 профилей в день. Это не только одна информация о профиле пользователя. – Rao

+0

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

+1

Нет, тогда это не так: я пошел бы с записью в файл в папку «Документы». В случае NSDictionary - только writeToFile, Также пара полезных советов: http://stackoverflow.com/questions/27197658/writing-swift-dictionary-to-file –