Computer >> Máy Tính >  >> Lập trình >> IOS

Làm cách nào để lưu trữ các đối tượng tùy chỉnh trong NSUserDefaults?

Trong bài viết này, chúng ta sẽ tìm hiểu cách lưu trữ các đối tượng tùy chỉnh trong ứng dụng của mình, nhưng trước khi bạn tìm hiểu cách lưu trữ đối tượng tùy chỉnh, hãy xem đối tượng tùy chỉnh là gì?

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

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

Chúng tôi sẽ tạo một lớp tùy chỉnh Person sẽ có một biến độ tuổi và biến tên.

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 đối tượng tùy chỉnh

Trong bước này, chúng tôi sẽ tạo một mảng đối tượng người, gọi nó là người và khởi tạo nó với dữ liệu ngẫu nhiên. Sau khi tạo đối tượng đó, chúng tôi sẽ sử dụng NSKeyedArchiver để lưu trữ đối tượng này và sau đó lưu trữ trong 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")

Bây giờ chúng tôi đã lưu thành công đối tượng được lưu trữ trong dữ liệu cốt lõi, đã đến lúc chúng tôi hủy lưu trữ và in đối tượng đó.

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

Tương tự như NSKeyedArchiver, chúng tôi có NSKeyedUnarchiver mà chúng tôi sẽ sử dụng để hủy lưu trữ đối tượng này.

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

Bây giờ đối tượng “decodedPeople” này chứa đối tượng mà chúng tôi đã tạo ở bước thứ hai.

Chúng tôi có thể thực hiện các hoạt động mong muốn với tại đối tượng. Bây giờ, hãy xem tệp ViewController trông như thế nào;

import UIKit
class ViewController: UIViewController {
   override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
      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)
   }
}

Bây giờ, hãy đặt dấu ngắt trên câu lệnh in cuối cùng và chạy mã này, khi được thực thi, hãy chạy lệnh này

po decodedPeople.first?.name

điều này sẽ dẫn đến

Optional<String>
- some : "P1"

Cuối cùng thì đây là cách nó trông như thế này.

Làm cách nào để lưu trữ các đối tượng tùy chỉnh trong NSUserDefaults?