简体   繁体   English

将类的 NSArray 保存到 cacheDirectory

[英]Save NSArray of Class to cacheDirectory

I'd like to NSArray of Class to the cacheDirectory.我想把类的 NSArray 放到 cacheDirectory 中。 I've wrote as following, however it returns false.我写如下,但它返回false。 Could you tell me how to solve this problem?你能告诉我如何解决这个问题吗? Thank you for your kindness.谢谢你的好意。

let paths2 = NSSearchPathForDirectoriesInDomains(
        .CachesDirectory,
        .UserDomainMask, true)
    let cachesPath: AnyObject = paths2[0]

    var cachedQuestions:NSArray = questions as NSArray
    let filePath = cachesPath.stringByAppendingPathComponent("CachedQuestions")

    class Dog {
        var id:Int?
        var name:String?
        init(id:Int, name:String) {
            self.id = id
            self.name = name
        }
    }

    var dogs = [Dog]()
    dogs.append(Dog(id:1, name:"taro"))
    dogs.append(Dog(id:2, name:"jiro"))
    var nsArrayDogs:NSArray = dogs as NSArray

    let success = nsArrayDogs.writeToFile(filePath, atomically: true)

    if success {
        println("save success")
    }

Xcode 11 • Swift 5.1 Xcode 11 • Swift 5.1

You can make your Dog class NSCoding compliant:你可以让你的狗类 NSCoding 兼容:

class Dog: NSObject, NSCoding {
    let id: Int
    let name: String
    required init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
    required init(coder decoder: NSCoder) {
        self.id = decoder.decodeInteger(forKey: "id")
        self.name = decoder.decodeObject(forKey: "name") as? String ?? ""
    }
    func encode(with coder: NSCoder) {
        coder.encode(id, forKey: "id")
        coder.encode(name, forKey: "name")
    }
}

Then you can save your array data to disk as follow:然后,您可以将阵列数据保存到磁盘,如下所示:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let dog1 = Dog(id: 1, name: "taro")
        let dog2 = Dog(id: 2, name: "jiro")
        do {
            let cachesDirectoryURL = try FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
            let array = [dog1, dog2]
            let fileURL = cachesDirectoryURL.appendingPathComponent("CachedQuestions.plist")
            let data = try NSKeyedArchiver.archivedData(withRootObject: array, requiringSecureCoding: false)
            try data.write(to: fileURL)
            print("saved")  // "saved\n"
            // to load it from disk
            if let dogs = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(Data(contentsOf: fileURL)) as? [Dog] {
                print(dogs.count)   // 2
            }
        } catch {
            print(error)
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM