2015-04-17 4 views
2

Мне нужна помощь в создании методов для чтения/записи некоторых объектов в файл для постоянного хранения. Я застрял на этом последние 3 дня. Это где я получил:Постоянное хранилище для массива объектов в Swift

Мой объект:

class Item: NSObject { 
var name : String = "" 
var link : String = "" 
var state : String = "" 
var type : String = "" 
var selected = false 

func createItemWith(name:String, link:String, state:String, type:String) { 
    self.name = name 
    self.link = link 
    self.state = state 
    self.type = type 
} 
} 

Затем добавить его в массив

self.itemsArray.addObject(item) 

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

func collectionView(collectionView: UICollectionView, 
    didSelectItemAtIndexPath indexPath: NSIndexPath) { 
     let cell = self.collectionView.cellForItemAtIndexPath(indexPath) 
     var cellCheckedImage = cell!.contentView.viewWithTag(20) as! UIImageView 
     if ((itemsArray.objectAtIndex(indexPath.row) as! Item).selected == false) { 
      cellCheckedImage.image = UIImage(named:"Checked") 
      self.selectedItemsArray.append(itemsArray.objectAtIndex(indexPath.row) as! Item) 
      (itemsArray.objectAtIndex(indexPath.row) as! Item).selected = true 
     } else if ((itemsArray.objectAtIndex(indexPath.row) as! Item).selected == true) { 
      cellCheckedImage.image = UIImage(named:"Unchecked") 
      (itemsArray.objectAtIndex(indexPath.row) as! Item).selected = false 
     } 
} 

Теперь вы можете видеть, элементы, с которыми пользователь взаимодействовал, я буду перемещаться на второй а rray

self.selectedItemsArray.append(itemsArray.objectAtIndex(indexPath.row) as! Item) 

который

var selectedItemsArray = [Item]() 

Теперь у меня есть второй класс, который должен написать предыдущий массив в файл

import Foundation 

private let _SelectedItemsSharedInstance = SelectedItems() 

class SelectedItems: NSObject { 

private var itemsKey = "items" 
var selectedItems = Array("") 

class var sharedInstance: SelectedItems { 
    return _SelectedItemsSharedInstance 
} 

func loadItemsFromFile() { 
    // getting path 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths[0] as! String 
    let path = documentsDirectory.stringByAppendingPathComponent("SelectedItems.plist") 
    let fileManager = NSFileManager.defaultManager() 
    //check if file exists 
    if(fileManager.fileExistsAtPath(path)) { 


    } 
} 

func writeItemsToFile() { 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths.objectAtIndex(0) as! NSString 
    let path = documentsDirectory.stringByAppendingPathComponent("SelectedItems.plist") 
} 
} 

Это то, где я застрял. Как я могу написать и прочитать selectedItems в файл?

Update: это, как он работал Мой Объект:

class Item: NSObject { 
var name : NSString = "" 
var link : NSString = "" 
var state : NSString = "" 
var type : NSString = "" 
var selected = false 

func createItemWith(name:String, link:String, state:String, type:String) { 
    self.name = name 
    self.link = link 
    self.state = state 
    self.type = type 
} 

init(name: NSString, link: NSString, state: NSString, type: NSString) 
{ 
    self.name = name 
    self.link = link 
    self.state = state 
    self.type = type 
} 

required init(coder aDecoder: NSCoder) { 
    self.link = aDecoder.decodeObjectForKey("link") as! NSString as String 
    self.name = aDecoder.decodeObjectForKey("name") as! NSString as String 
    self.state = aDecoder.decodeObjectForKey("state") as! NSString as String 
    self.type = aDecoder.decodeObjectForKey("type") as! NSString as String 
} 

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(link, forKey: "link") 
    aCoder.encodeObject(name, forKey: "name") 
    aCoder.encodeObject(name, forKey: "state") 
    aCoder.encodeObject(name, forKey: "type") 
} 

} 

И методы, которые пишут и читают их

func loadItemsFromFile() { 
    // getting path 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths[0] as! String 
    let path = documentsDirectory.stringByAppendingPathComponent("SelectedItems.txt") 
    let fileManager = NSFileManager.defaultManager() 
    println(path) 
    if(!fileManager.fileExistsAtPath(path)) { 
     // If it doesn't, copy it from the default file in the Bundle 
     if let bundlePath = NSBundle.mainBundle().pathForResource("SelectedItems", ofType: "txt") { 
      let resultDictionary = NSMutableDictionary(contentsOfFile: bundlePath) 
      if let data = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? [String] { 
       self.selectedItemsArray = data 
      } 
     } 
    } 
    println(self.selectedItemsArray.description) 
} 

func writeItemsToFile() { 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths.objectAtIndex(0) as! NSString 
    let path = documentsDirectory.stringByAppendingPathComponent("SelectedItems.txt") 
    NSKeyedArchiver.archiveRootObject(self.selectedItemsArray, toFile: path) 

} 
+0

Вы пытались использовать метод writeToFile: '? –

+0

Да, конечно, но письменный файл пуст. Мне кажется, мне нужно кодировать и декодировать мои данные, когда они написаны и прочитаны. –

ответ

1

Вы можете использовать NSKeyedArchiver и NSKeyedUnarchiver для хранения массива файл. Что-то вроде этого:

func applicationWillTerminate(aNotification: NSNotification) { 
    NSKeyedArchiver.archiveRootObject(self.myArray, toFile: "a/file/path") 
} 

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    if let data = NSKeyedUnarchiver.unarchiveObjectWithFile("a/file/path") as? [String] { 
     self.myArray = data 
    } 
} 

В этом примере я использую его в методах AppDelegate, но вы можете использовать его в любом месте в вашем приложении.

+0

Спасибо! Это было сделано, но для реализации init и encodeWithCoder в моем классе объектов требовалось реализовать. Я обновлю родительский вопрос, чтобы отразить изменения, которые я сделал! –

+0

К сожалению, я забыл упомянуть эту деталь. – Moritz

Смежные вопросы