2016-04-26 42 views
1

我是Swift和iOS中的新成员,在制作应用程序时遇到此问题。我想基本上使用NSCoding存储用户数据到本地存储。但是,我的代码不能这样做。任何人都可以告诉我它有什么问题?非常感激!Swift,NSCoding保存不能正常工作的类的数组

另外,saveChecklist和LoadChecklist均在appDelegate中的applicationDidEnterBackground和applicationWillTerminate下调用。

我有一种感觉,我的问题在于encodeWithCoder和init(aDecoder),因为我使用GET将我的Checklist项添加到列表中。

我在DataModel.class代码:

import Foundation 

class DataModel: NSObject, NSCoding { 
var checklist = Checklist() 
var lists: [Checklist] { 
    get { 
     return [checklist] 
    } 
    set { 
    } 
} 

override init() { 
    super.init() 
    loadChecklist() 
} 

// MARK: - All the saving stuff 

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(checklist, forKey: "Checklist") 
} 

required init?(coder aDecoder: NSCoder) { 
    checklist = aDecoder.decodeObjectForKey("Checklist") as! Checklist 
} 

func documentsDirectory() -> String { 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 

    return paths[0] 
} 

func dataFilePath() -> String { 
    return (documentsDirectory() as NSString).stringByAppendingPathComponent("Checklist.plist") // create file if no checklist.plist is present 
} 

func saveChecklist() { 
    let data = NSMutableData() 
    let archiver = NSKeyedArchiver(forWritingWithMutableData: data) 
    archiver.encodeObject(lists, forKey: "Checklists") 
    archiver.finishEncoding() 

    data.writeToFile(dataFilePath(), atomically: true) 
} 

func loadChecklist() { 
    let path = dataFilePath() 
    if NSFileManager.defaultManager().fileExistsAtPath(path) { 
     if let data = NSData(contentsOfFile: path) { 
      let unarchiver = NSKeyedUnarchiver(forReadingWithData: data) 
      lists = unarchiver.decodeObjectForKey("Checklists") as! [Checklist] 

      unarchiver.finishDecoding() 
     } 
    } 
} 

我在Checklist.class代码:

import Foundation 

class Checklist: NSObject, NSCoding { 
var item = [items]() 
var rituals = [items]() 
var doneButtonVisible: Bool 
var streak: Int 
var itemDoneCount: Int 
var startDate: NSDate 
var dayHasStarted: Bool 

override init() { 
    doneButtonVisible = false 
    itemDoneCount = 0 
    streak = 0 
    startDate = NSDate() 
    dayHasStarted = false 
    super.init() 
} 

// saves 
func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(item, forKey: "Items") 
    aCoder.encodeObject(rituals, forKey: "Rituals") 
    aCoder.encodeObject(itemDoneCount, forKey: "ItemDoneCount") 
    aCoder.encodeObject(doneButtonVisible, forKey: "DoneButtonVisible") 
    aCoder.encodeObject(streak, forKey: "Streak") 
    aCoder.encodeObject(startDate, forKey: "StartDate") 
    aCoder.encodeObject(dayHasStarted, forKey: "DayHasStarted") 
} 

// loads 
required init?(coder aDecoder: NSCoder) { 
    item = aDecoder.decodeObjectForKey("Items") as! [items] 
    rituals = aDecoder.decodeObjectForKey("Rituals") as! [items] 
    itemDoneCount = aDecoder.decodeObjectForKey("ItemDoneCount") as! Int 
    doneButtonVisible = aDecoder.decodeObjectForKey("DoneButtonVisible") as! Bool 
    streak = aDecoder.decodeObjectForKey("Streak") as! Int 
    startDate = aDecoder.decodeObjectForKey("StartDate") as! NSDate 
    dayHasStarted = aDecoder.decodeObjectForKey("DayHasStarted") as! Bool 
    super.init() 
} 

}

UPDATE

解决保存和加载问题通过修改我的数据模型。使用Core Data来保存和加载数据。

但是,我仍然不知道为什么上面的代码不加载。显然,它不会保存清单的内容。

回答

1

您的Checklist类也需要从NSCoding继承,并实现encodeWithCoder(coder: NSCoder)方法。 This是一个关于NSCoding的好教程。

+0

嗨,谢谢你的回答!然而,我的清单继承自NSCoding,它仍然不起作用。我会更新该文章以包含它,以便您可以检查它。 –

+0

好的,你的代码不能用什么方式工作?当你尝试加载或保存时,你会得到一个错误吗?或者数据刚刚重新创建/缺少一些内容? – GoatInTheMachine

+1

没有发生任何错误,只是数据在重新启动应用程序时未加载,或者数据未保存起始。如果我没有使用GET方法,并且只在viewController的dataModel中附加一个清单项,它就可以工作。我相信它与GET方法有关。无论如何,我已经决定使用Core Data来存储它,并且修改了我的整个数据模型,现在它可以工作。我仍然不知道为什么上面的代码不起作用。 –