【问题标题】:Save NSArray of Class to cacheDirectory将类的 NSArray 保存到 cacheDirectory
【发布时间】:2015-09-06 05:23:51
【问题描述】:

我想把 NSArray 的 Class 放到 cacheDirectory 中。我写了如下,但是它返回false。你能告诉我如何解决这个问题吗?谢谢你的好意。

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")
    }

【问题讨论】:

  • 如果目录不存在,可能需要创建。

标签: ios swift nsarray writetofile


【解决方案1】:

Xcode 11 • Swift 5.1

你可以让你的 Dog 类 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")
    }
}

然后您可以将阵列数据保存到磁盘,如下所示:

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)
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多