2015-04-17 52 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写入文件?

更新:这是它如何工作 我的对象:

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

您可以使用NSKeyedArchiverNSKeyedUnarchiver你的阵列存储一份文件。事情是这样的:

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