NSUSerDefaults
è davvero veloce da implementare, ma soprattutto con l'aumentare della domanda, si desidera memorizzare sempre di più, sono andato direttamente per i file plist.
Per lo più, le persone vogliono archiviare un elenco di qualcosa, quindi ecco la mia condivisione su come farlo con NSDictionary.Questo non richiede di creare un file plist prima, verrà creata la prima volta risparmiando qualcosa
Xcode 7 beta, Swift 2,0
risparmio
func SaveItemFavorites(items : Array<ItemFavorite>) -> Bool
{
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let docuDir = paths.firstObject as! String
let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath)
let filemanager = NSFileManager.defaultManager()
let array = NSMutableArray()
for var i = 0 ; i < items.count ; i++
{
let dict = NSMutableDictionary()
let ItemCode = items[i].ItemCode as NSString
dict.setObject(ItemCode, forKey: "ItemCode")
//add any aditional..
array[i] = dict
}
let favoritesDictionary = NSDictionary(object: array, forKey: "favorites")
//check if file exists
if(!filemanager.fileExistsAtPath(path))
{
let created = filemanager.createFileAtPath(path, contents: nil, attributes: nil)
if(created)
{
let succeeded = favoritesDictionary.writeToFile(path, atomically: true)
return succeeded
}
return false
}
else
{
let succeeded = notificationDictionary.writeToFile(path, atomically: true)
return succeeded
}
}
piccola nota dai documenti:
NSDictionary.writeToFile (percorso: atomicamente :)
Questo metodo convalida in modo ricorsivo che tutti gli oggetti contenuti sono oggetti elenco delle proprietà (istanze di NSData
, NSDate
, NSNumber
, NSString
, NSArray
, o NSDictionary
) prima di scrivere fuori il file, e non ha prodotto alcun se tutti gli oggetti non sono di proprietà elenca gli oggetti, poiché il file risultante non sarebbe un elenco di proprietà valido.
Quindi qualsiasi cosa si imposta su dict.SetObject()
dovrebbe essere uno dei tipi sopra menzionati.
carico
private let ItemFavoritesFilePath = "ItemFavorites.plist"
func LoadItemFavorites() -> Array<ItemFavorite>
{
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let docuDir = paths.firstObject as! String
let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath)
let dict = NSDictionary(contentsOfFile: path)
let dictitems : AnyObject? = dict?.objectForKey("favorites")
var favoriteItemsList = Array<ItemFavorite>()
if let arrayitems = dictitems as? NSArray
{
for var i = 0;i<arrayitems.count;i++
{
if let itemDict = arrayitems[i] as? NSDictionary
{
let ItemCode = itemDict.objectForKey("ItemCode") as? String
//get any additional
let ItemFavorite = ItemFavorite(item: ItemCode)
favoriteItemsList.append(ItemFavorite)
}
}
}
return favoriteItemsList
}
Ho implementato la soluzione PList per un elenco di URL utilizzati di recente. Sembra che PList sia l'approccio corretto per il mio problema. Ma devo dire che dopo aver fatto lo stesso su Android, questo è stato sorprendentemente molto più coinvolto per quanto riguarda una curva di apprendimento e lo sforzo complessivo. Quindi devo commentare e dire grazie mille per il codice di esempio sopra ... – user574771
Domanda ... quando dici "non puoi scrivere nelle risorse delle tue app" intendi che non possiamo scrivere su un plist che creiamo e popoliamo da dentro xcode? – crazyCoder
Puoi solo scrivere nella directory Documenti della tua app. Quindi è possibile copiare quel plist dalla directory Resources alla directory Documents in fase di esecuzione e quindi modificarlo. – doppioslash