Cách lưu data sử dụng NSUserDefaults

Đặt vấn đề.

Lấy ví dụ chúng ta đang làm một cái app Chat, thì việc phải lưu thông tin của User là việc hết sức quan trọng. Chúng ta không thể bắt User mỗi khi sử dụng App phải đăng nhập. Vậy thì làm sao App chúng ta có thể nhớ được thông tin đăng nhập của User trước đó????. Trên thực tế có rất nhiều cách để lưu data và có 5 cách phổ biến :

  • Core Data
  • Third Party DB (như là Realm, Object Mapper ...)
  • NSKeyedArchiver / NSCoding
  • NSUserDefaults
  • Keychain Service

Đây là những lựa chọn cho chúng ta khi giải quyết vấn đề lưu trữ data dưới local, tuy nhiên mỗi lựa chọn sẽ có ưu và nhược điểm khác nhau, tuỳ theo trường hợp mà chúng ta sử dụng cho phù hợp.

Hôm nay mình sẽ giới thiệu cho các bạn một trong những cách lưu data đó là sử dụng NSUserDefaults , và ưu nhược điểm của NSUserDefaults mình sẽ để ở cuối bài viết này.

NSUserDefaults là gì?

NSUserDefaults là một class mà cho phép chúng ta lưu trữ được nhiều loại dữ liệu khác nhau. Nó sẽ hoàn toàn phù hợp với khối lượng dữ liệu không quá lớn, và bạn có thể sử dụng chúng với những loại dữ liệu đơn giản.

NSUserDefaults sẽ hỗ trợ những loại dữ liệu :

  • Bool
  • Double
  • Int
  • String
  • NSURL
  • Arrays
  • Dictionary
  • NSDate
  • NSData

Cách khởi tạo NSUserDefaults

Hai công việc rất quen thuộc mà khi sử dụng NSUserDefaults mà bạn phải luôn nhớ đó là Saving DataReading Data , nhưng trước hết chúng ta phải gọi đến class NSUserDefautls để khởi tạo.

let defaults = NSUserDefaults.standardUserDefaults()

Cách Writing Data

Ở đây ví dụ mình có 2 thông tin cần lưu đó là Username và Password

Password ở đây mình cho nó là kiểu Int và Username là kiểu String

var  userName : String?
var  password : Int?

mình sẽ lưu như sau :

defautls.set(userName, forKey : "UsernameLocal")
defaults.set(password, forKey : "PasswordLocal")

Với những data mà chúng ta lưu sẽ được phân biệt dựa trên những key mà chúng ta đã đặt.

Ngoài ra giả sử chúng ta muốn lưu một Array hay một Dictionary thì chúng ta hoàn toàn có thể làm được điều đó với NSUserdefaults

let array = ["Hung", "Handsome"]
defaults.set(array, forKey: "SavedArray")

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

Cách Reading Data

Read data cũng tương tự với write data , chúng ta sẽ read data dựa trên những key mà chúng ta đã đặt để read data lên.

let defaults = UserDefaults.standard

let userName = defaults.String(forKey: "UsernameLocal")
let password = defaults.Int(forKey: "PasswordLocal")

Và để read Array thì ta làm như sau :

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

Cách làm rất đơn giản và dễ hiểu đúng không nào? :))))

Cách Deleting Data

Có ghi thì ắt sẽ có xoá, thì trong trường hợp bạn muốn xoá một data nào đó mà bạn không cần dùng nữa thì làm theo cách sau:

BaseVC.defaults.removeObject(forKey: "SaveArray")

Synchronizing

Có một lưu ý nhỏ, khi bạn writing data , thì data đó không phải lúc nào cũng được write như ý muốn, có thể là có nhiều luồng khác đang thực thi bên dưới , vì vậy để đảm bảo tính đồng bộ, cũng như là chắc chắn data đó được write ngay lập tức thì chúng ta thêm 1 dòng code như bên dưới :

defautls.synchronize() //Swift

Phân tích NSUserDefaults

Như mình đã nói ở đầu bài, chúng ta có rất nhiều cách để lưu data xuống local , và tuỳ trường hợp mà chúng ta sử dụng.

Mà tuỳ trường hợp là tuỳ làm sao ????

Bây giờ mình sẽ chỉ ra những điểm yếu của NSUserDefaults cho bạn thấy :

Đầu tiên là về bảo mật thông tin

   Nếu như thông tin bạn lưu xuống local là những thông tin nhạy cảm như là Password , Thông tin tài khoản ngân hàng ..v.v  thì việc dùng NSUserdefaults là một lựa chọn sai lầm, vì người khác hoàn toàn có thể đọc được tất cả những data  đó. Thay vào đó , nếu như những data lưu xuống local là những data nhạy cảm, hay quan trọng thì bạn phải dùng tới KeyChain, một lựa chọn mà mình đã có giới thiệu ở trên.

Thứ hai là về độ lớn dữ liệu

    Nếu bạn muốn lưu dữ liệu có  khối lượng lớn và phức tạp thì việc dùng NSUserDefaults dường như là một bad choice. Trong trường hợp này , tốt nhất nên dùng Core Data , còn NSUserdefaults sẽ thích hợp hơn với những loại dữ liệu như Name , High Score , Gender, Nickname in Game ..v.v.

Người viết : Nguyễn Khánh Hưng

results matching ""

    No results matching ""