Nếu muốn lưu một vài dữ liệu nhỏ trong app iOS mà không cần phải kết nối vào một cơ sở dữ liệu nào thì UserDefaults là một lựa chọn.

Chúng ta có thể sử dụng UserDefaults để lưu trữ bất kỳ loại dữ liệu cơ bản nào miễn là ứng dụng được cài đặt. Có thể lưu vào UserDefaults các kiểu dữ liệu cơ bản như Bool, Float, Double, Int, String hoặc URL, nhưng cũng có thể viết các kiểu phức tạp hơn như Arrays, Dictionaries và Date - và thậm chí cả giá trị Data.

 

Writing

Khi ghi dữ liệu vào UserDefaults, nó tự động được tải khi ứng dụng khởi chạy để bạn có thể đọc và sử dụng. Điều này làm cho việc sử dụng nó thực sự dễ dàng, nhưng lưu trữ nhiều dữ liệu trong đó là một ý tưởng tồi vì nó sẽ làm chậm quá trình tải ứng dụng. Nếu dữ liệu cần lưu của mình sẽ chiếm hơn 100KB, thì UserDefaults gần như chắc chắn là lựa chọn sai lầm.

Để bắt đầu với UserDefaults, hãy khởi tạo như sau:

let defaults = UserDefaults.standard

Sau khi hoàn tất, thật dễ dàng để lưu nhiều giá trị - bạn chỉ cần cung cấp cho mỗi giá trị một khóa duy nhất để bạn có thể gọi khi sử dụng. Những giá trị này gần như luôn không có ý nghĩa ngoài việc bạn sử dụng chúng cho mục đích gì, vì vậy chỉ cần đảm bảo các tên khóa đáng nhớ.

Ví dụ:

let defaults = UserDefaults.standard
defaults.set(25, forKey: "Age")
defaults.set(true, forKey: "UseTouchID")
defaults.set(CGFloat.pi, forKey: "Pi")
defaults.set("Paul Hudson", forKey: "Name")
defaults.set(Date(), forKey: "LastRun")

Ngay cả khi bạn đang cố gắng lưu các loại dữ liệu phức tạp như arrays và dictionaries, UserDefaults vẫn giải quyết vấn đề dễ dàng:

let array = ["Hello", "World"]
defaults.set(array, forKey: "SavedArray")

let dict = ["Name": "Paul", "Country": "UK"]
defaults.set(dict, forKey: "SavedDict")

 

Reading

Khi bạn đang đọc các giá trị từ UserDefaults, bạn cần kiểm tra kỹ loại trả về để đảm bảo bạn biết mình đang nhận được gì.

  • integer(forKey:) trả về một số nguyên nếu khoá tồn tại hoặc 0 nếu  không tồn tại
  • bool(forKey:) trả về một giá trị kiểu bool nếu khoá tồn tại hoặc false nếu  không tồn tại
  • float(forKey:) trả về một số thực nếu khoá tồn tại hoặc 0.0 nếu không tồn tại
  • double(forKey:) trả về một số thực nếu khoá tồn tại hoặc 0.0 nếu không tồn tại
  • object(forKey:) trả lại Any? vì vậy cần ép kiểu dữ liệu khi sử dụng

Việc biết các giá trị trả về là rất quan trọng, bởi vì nếu bạn sử dụng bool (forKey :) và nhận về "false", điều đó có nghĩa là khóa không tồn tại hoặc có lẽ nó đã tồn tại và bạn chỉ đặt nó là false?

object(forKey:) sẽ khiến bạn bận tâm nhất, vì khi đọc thì nó là đối tượng optional. Bạn phải đối mặt với hai lựa chọn:

  • Sử dụng như as! để buộc đối tượng của bạn thành kiểu dữ liệu mà nó nên có.
  • Sử dụng như as? để tùy chọn đối tượng của bạn theo kiểu dữ liệu mà nó nên có.

 Nếu bạn sử dụng as! và object (forKey :) trả về nil, bạn sẽ gặp lỗi, vì vậy tôi thực sự không khuyên dùng nó trừ khi bạn hoàn toàn chắc chắn.

Có một giải pháp khác ở đây, chúng ta sử dụng ?? để phòng hờ giá trị nếu giá trị trả về là nil

Ví dụ: giả sử chúng ta muốn đọc mảng mà chúng ta đã lưu trước đó với tên khóa là SavedArray:

let array = defaults.object(forKey:"SavedArray") as? [String] ?? [String]()

Và, nếu SavedArray tồn tại và là một arrays, nó sẽ được đặt vào hằng số mảng. Nếu nó không tồn tại (hoặc nếu nó tồn tại và không phải là một mảng chuỗi), thì mảng được đặt thành một mảng chuỗi mới.

Kỹ thuật này cũng hoạt động đối với dictionaries:

let dict = defaults.object(forKey: "SavedDict") as? [String: String] ?? [String: String]()

 

Như vậy, bạn hoàn toàn có thể sử dụng UserDefaults để lưu trữ dữ liệu nhỏ và có thể gọi bất kỳ nơi đâu, bất kỳ lúc nào trong app.

 

Course

Khóa học IOS Swift cơ bản tại Techmaster: khóa học dành cho người mới bắt đầu không yêu cầu đầu vào

  • Ngày khai giảng: 16/10/2020
  • Thời gian học: 18:30 - 21:30 | Thứ 4 và thứ 6 
  • Địa điểm: tầng 12A, tòa nhà Viwaseen, số 48 Tố Hữu, Trung Văn, Nam Từ Liêm, Hà Nội
  • Học phí: 3,9 triệu đồng 
  • Liên hệ tư vấn: Trương Minh Thúy - 0967983563 support@techmaster.vn