Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> iOS

Cách lưu trữ đối tượng tùy chỉnh (custom objects) trong NSUserDefaults?


Bài này học cách lưu đối tượng tùy chỉnh trong ứng dụng, trước tiên xem đối tượng tùy chỉnh là gì?

Đối tượng tùy chỉnh là bất kỳ class, struct hoặc dữ liệu nào không phải kiểu dữ liệu gốc như Int, Double, String. Lưu dữ liệu trong NSUserDefaults là quy trình 3 bước.

Tạo đối tượng tùy chỉnh

Tạo class Person tuân thủ NSObject, NSCoding với biến age và name.

class Person: NSObject, NSCoding {    var name: String    var age: Int    init(name: String, age: Int) {       self.name = name       self.age = age    }    required convenience init(coder aCoder: NSCoder) {       let name = aCoder.decodeObject(forKey: "name") as! String       let age = aCoder.decodeInteger(forKey: "age")       self.init(name: name, age: age)    }    func encode(with acoder: NSCoder) {       acoder.encode(age, forKey: "age")       acoder.encode(name, forKey: "name")    } }

Mã hóa (Encoding) đối tượng tùy chỉnh

Tạo mảng đối tượng Person, gọi là people, khởi tạo dữ liệu ngẫu nhiên. Dùng NSKeyedArchiver lưu trữ (archive) đối tượng này và lưu vào UserDefaults.

let people = [    Person.init(name: "P1", age: 1),    Person.init(name: "P2", age: 2),    Person.init(name: "P3", age: 3), ] let encoded = NSKeyedArchiver.archivedData(withRootObject: people) UserDefaults.standard.set(encoded, forKey: "encodedData")

Đã lưu đối tượng archived vào core data, giờ giải nén (unarchive) và in đối tượng.

Giải mã (Decoding) đối tượng tùy chỉnh

Tương tự NSKeyedArchiver, dùng NSKeyedUnarchiver để giải nén.

let decoded = UserDefaults.standard.object(forKey: "encodedData") as! Data let decodedPeople = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Person]

Đối tượng "decodedPeople" chứa đối tượng tạo ở bước 2.

Có thể thực hiện thao tác mong muốn với đối tượng. Xem file ViewController hoàn chỉnh:

import UIKit class ViewController: UIViewController {    override func viewDidLoad() {       super.viewDidLoad()       let people = [          Person.init(name: "P1", age: 1),          Person.init(name: "P2", age: 2),          Person.init(name: "P3", age: 3),       ]       let encoded = NSKeyedArchiver.archivedData(withRootObject: people)       UserDefaults.standard.set(encoded, forKey: "encodedData")       print("data decoded, encoding now")       let decoded = UserDefaults.standard.object(forKey: "encodedData") as! Data       let decodedPeople = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Person]       print(decodedPeople)    } }

Đặt breakpoint ở print cuối và chạy, thực hiện lệnh:

po decodedPeople.first?.name

Kết quả:

Optional<String> - some : "P1"

Hình ảnh kết quả:

Cách lưu trữ đối tượng tùy chỉnh (custom objects) trong NSUserDefaults?