Home

UserDefaults in Swift

Word count: 774 / Reading time: 5 min
2019/03/20 Share

Có nhiều cách để lưu trữ dữ liệu cục bộ trong ứng dụng iOS. UserDefaults là một trong số các cách phổ biến nhất để làm việc đó.

UserDefaults

An interface to the user’s defaults database, where you store key-value
pairs persistently across launches of your app. (Một giao diện cơ sở dữ liệu mặc định, cho phép lưu trữ các cặp key - value trong các lần khởi chạy ứng dụng.)

Loại dữ liệu nào chúng ta có thể lưu trữ trong UserDefaults?

A default object must be a property list—that is, an instance of (or for collections, a combination of instances of) NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of NSData. (Một đối tượng UserDefaults là một property list, đó là một thể hiện của NSData, NSString, NSNumber, NSDate, NSArray. Nếu bạn muốn lưu trữ bất kỳ loại đối tượng nào khác, bạn nên lưu trữ dưới dạng thể hiện của NSData.)

Vậy “Property list“ là gì?

Là các file có đuôi .plist, dùng để lưu các dữ liệu có dạng như một hệ thống phân cấp, như các biến NSArray, hay NSDictionary, với dung lượng không quá lớn. Việc lưu các dữ liệu kiểu này vào các file plist sẽ làm cho dữ liệu được lưu hiển thị một cách rõ ràng nhất. “Property list” phổ biến mà bạn hay gặp đó là file info.plist khi khởi tạo một project iOS.

Khi bạn lưu trữ một đối tượng với UserDefaults thì nó sẽ được lưu ở 1 file .plist trong folder Library của ứng dụng. Chúng ta có thể kiểm tra trong folder Library như sau:

1
2
3
4
5
6
7
8
9
10
11
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

UserDefaults.standard.set("https://sun-asterisk.com", forKey: "website")
UserDefaults.standard.set(false, forKey: "framgia")

let library_path = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0]

print("App Library Path is \(library_path)")

return true
}

Chạy ứng dụng sau đó nhấn tổ hợp “cmd” + “shift” + “G”, copy đường dẫn vừa được in ra để đi tới folder Library của ứng dụng.

Bạn sẽ thấy hai folder “Caches” và “Preferences”, file UserDefaults plist sẽ được lưu ở folder “Preferences”.

Double click vào file plist sẽ thấy được các key-value tương ứng đã được lưu:

Vì UserDefaults sử dụng định dạng .plist để lưu dữ liệu, nên chỉ có thể lưu trữ dữ liệu với loại NSString, NSNumber, NSData, NSArray, NSDadata hoặc NSData. Nếu muốn lưu trữ đối tượng tùy chỉnh vào UserDefaults, chúng ta có thể sử dụng Codable và PropertyListEncoder convert sang NSData để lưu.

Việc lưu trữ một lượng lớn dữ liệu vào UserDefaults có thể ảnh hưởng đáng kể đến hiệu suất của ứng dụng vì toàn bộ tệp plist UserDefaults được tải vào bộ nhớ khi ứng dụng của bạn khởi chạy. Như đã đề cập trong Apple Document:

UserDefaults caches the information to avoid having to open the user’s defaults database each time you need a default value.

Kết

UserDefaults rất thích hợp để lưu trữ các dữ liệu “nhỏ, gọn” . Tuy nhiên do UserDefaults lưu trữ ở file plist trong folder Library của ứng dụng, nên có thể dễ dàng bị can thiệp và thay đổi vì vậy không thích hợp lưu trữ các dữ liệu yêu cầu bảo mật. Với các dữ liệu yêu cầu bảo mật thì các bạn có thể dùng Keychain để lưu trữ.

CATALOG
  1. 1. UserDefaults
  2. 2. Kết