2012-01-10 27 views
23

Tôi mới phát triển iOS và phát triển ứng dụng dành cho thiết bị di động nói chung, tôi có kiến ​​thức phong nha về các mẫu Objective C và MVC được sử dụng và tôi chưa bao giờ thực hiện bất kỳ phát triển Mac nào.Tại sao NSUserDefaults được sử dụng trong iOS?

Tôi đang cố gắng để hiểu những gì NSUserDefaults là dành cho?

Chúng tôi đã có một cái gì đó giống như PList lưu trữ dữ liệu dưới dạng XML và chúng tôi có SQLite là DB nhẹ cho các thiết bị đó.

Sau đó, tại sao chúng ta có nó?

Đây có phải là kho lưu trữ khóa-giá trị đơn giản thay thế cho ứng dụng của chúng tôi giống như cách chúng tôi có các loại lưu trữ khác nhau trên đám mây như RDBMS và kho lưu trữ NoSQL có khóa-giá trị không?

Đối NSUserDefaults, Apple tài liệu nói rằng: -

"Ứng dụng kỷ lục độ ưu đãi đó bằng cách gán giá trị cho một tập hợp các thông số trong cơ sở dữ liệu mặc định của người dùng"

sao họ có ý nghĩa gì bởi cơ sở dữ liệu mặc định của người dùng ? Tôi nghĩ rằng, giống như trong bất kỳ hệ điều hành đa người dùng nào, chúng tôi có nhiều tài khoản người dùng và cũng giống như trong Mac, chúng tôi có thể có nhiều người dùng mỗi cơ sở dữ liệu từ nơi ứng dụng sẽ tải tùy chọn đã lưu người dùng.

Vì vậy, giống như Mac OS X, iOS cũng có nhiều người dùng và tùy thuộc vào tùy chọn nào được đăng nhập NSUserDefaults chọn tùy chọn của anh ấy/cô ấy?

Hãy cho tôi biết nếu tôi sai.

+0

Kiểm tra điều này: http://jayprakashdubey.blogspot.in/2014/07/nsuserdefault-usage.html –

Trả lời

13

NSUserDefault được sử dụng để lưu các phần dữ liệu nhỏ mà ứng dụng phụ thuộc vào để chạy chính xác, trong khi các cách tiếp cận khác là tốt để lưu trữ lượng dữ liệu lớn hơn mà ứng dụng hoạt động.

NSUserMặc định làm cho việc này trở nên thật dễ dàng, vì bạn không phải lo lắng về tệp, thực thể, tìm nạp,…. Tất cả được thực hiện trong một dòng.

+1

tôi lưu trữ một số giá trị trong NSUserDefaults để sử dụng nó trên Relaunch của ứng dụng. nhưng tôi nhận được giá trị nil đôi khi sau một thời gian dài khởi chạy lại ứng dụng. – freelancer

+0

là một câu hỏi này? viết một cái mới với tất cả các mã có liên quan, vì NSUserDefaults nên lưu trữ thông tin vĩnh viễn. – vikingosegundo

1

NSUserDefaults giá trị được lưu trữ chỉ cho ứng dụng của bạn.

Lưu ý - Nó không có nghĩa là để thay thế cho một kho lưu trữ dữ liệu truyền thống (Dữ liệu cốt lõi, SQLite, Danh sách tài sản, v.v ... có nghĩa là để lưu trữ dữ liệu ứng dụng). Ý nghĩa của NSUserDefaults là dành cho các cặp khóa giá trị cụ thể.

Ví dụ: tôi sử dụng nó để lưu trữ tên mạng và tên đầy đủ của người dùng đã được xác thực sau khi quá trình đăng nhập hoàn tất. Sau khi hết giờ hoặc đăng xuất phiên, tôi xóa các giá trị đó. Đối với điều này NSUserDefaults tỏa sáng.

+0

Vì vậy, NSUserDefault là loại lưu trữ tạm thời cho một phiên ứng dụng? giống như phiên lưu trữ trong một ứng dụng web? –

+0

No. NSUserDefaults là để lưu trữ liên tục. Tổng số ngược lại tạm thời. Nếu bạn muốn dữ liệu của bạn ở đó mọi lúc và nếu nó khá nhỏ, hãy tiếp tục và lưu nó trong NSUserDefaults. Giả sử bạn đang phát triển trò chơi và ứng dụng của bạn bao gồm cài đặt Chế độ xem để người dùng chọn các tùy chọn như "Tên Nick", màu sắc, tốc độ, v.v, thì bạn nên sử dụng NSUserDefaults để lưu các tùy chọn người dùng đó. Bạn cũng có thể sử dụng plist và sql-lite nhưng thực hành tốt nhất được đề xuất bởi hầu hết các nhà phát triển iOS là sử dụng NSUserDefaults cho cài đặt ứng dụng. –

4

Ban đầu nó là để lưu trữ cài đặt, nhưng dường như nhận được (ab) được sử dụng cho rất nhiều thứ khác nếu các câu hỏi trên SO là bất cứ điều gì để đi theo. "Điểm" của nó là nó cung cấp phương thức truy xuất và lưu giữ dữ liệu một dòng cho một loạt các kiểu dữ liệu.

Không có cấu hình đa người dùng (chưa?) trên iOS (có bao giờ bạn phải đăng nhập vào iPhone của bạn?) Được tích hợp sẵn trong NSUserDefaults, nhưng vì OS X và iOS được xây dựng trên cùng nền tảng, cùng một lớp được sử dụng cho cả hai hệ điều hành.

+0

Vì vậy, vai trò NSUserDefaults trong MacOsX là lưu trữ cài đặt dưới dạng khóa-giá trị trong cơ sở dữ liệu mặc định của người dùng từ nơi ứng dụng có thể nhận dữ liệu. Nhưng hãy nói với tôi, trong iOS chỉ là một lưu trữ giá trị khóa đơn giản vì chỉ có một người dùng nên tên NS "Người dùng" mặc định như vậy không có ý nghĩa ở đây? Không nghi ngờ gì .. nó đang được sử dụng (ab): P Vậy trường hợp sử dụng của nó chính xác trong iOS là gì? Xin lỗi vì có chút ngớ ngẩn nhưng tôi không sở hữu một chiếc iPhone. Tôi đã làm rất nhiều dev web trong grad của tôi và phải làm việc trên iOS trong công ty của tôi. –

+0

Điều này phải được chọn làm câu trả lời đúng. Câu hỏi ban đầu: "Vì vậy, giống như Mac OS X, iOS cũng có nhiều người dùng và tùy thuộc vào bất cứ điều gì được đăng nhập vào NSUserDefaults chọn sở thích của mình?" không được giải quyết từ câu trả lời khác. – user523234

3

iOS là hệ điều hành một người dùng. Do đó, NSUserDefaults được sử dụng khác nhau trong OSX và iOS.

Trong iOS, bạn thường sử dụng NSUserDefaults để lưu tùy chọn ứng dụng và/hoặc dữ liệu người dùng trên "hệ thống mặc định iOS". Dữ liệu được lưu trong hệ thống mặc định sẽ liên tục ở mọi thời điểm ngay cả khi bạn khởi động lại thiết bị iOS. Như một vấn đề của thực tế, ngay cả khi người dùng cập nhật ứng dụng.

Bạn thường muốn sử dụng NSUserDefaults để lưu tùy chọn/cài đặt ứng dụng. Bất kỳ dữ liệu lớn khác như dữ liệu trò chơi hoặc tính toán thời gian thực phải được lưu trong CoreData hoặc sqllite trong thư mục tài liệu.

+0

Khi cài đặt mặc định của người dùng cập nhật ứng dụng bị xóa. –

+0

@AnkitJain Một chuỗi khác cho thấy điều đó không đúng, bên ngoài các trục trặc: http://stackoverflow.com/questions/1638766/do-nsuserdefaults-persist-through-an-update-to-an-app-in-the-appstore –

14

Một điều chưa được đề cập: NSUserDefaults hỗ trợ tất cả các loại vô hướng cơ bản (float, int, BOOL), cũng như các kiểu tương thích với plist: NSData, NSString, NSNumber, NSDate, NSArray và NSDictionary. NSUserDefaults chỉ là một front-end cho một tệp plist chuẩn trong thư mục Preferences của ứng dụng. Điều này giúp dễ dàng tạo ra lưu trữ liên tục cho trạng thái ứng dụng của bạn chỉ trong một vài dòng mã. Thậm chí tốt hơn, nếu bạn thực hiện NSCoding trên các đối tượng mô hình của bạn, bạn có thể lưu trữ chúng vào một NSData và đặt chúng trong NSUserDefaults:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects]; 

[[NSUserDefaults standardUserDefaults] setObject:data forKey:kDefaultsKeyModelObjects]; 

và khôi phục dữ liệu ứng dụng của bạn cũng đơn giản như

- (void)viewDidLoad 
{ 
    NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultsKeyModelObjects]; 

    arrayOfModelObjects = [[NSKeyedUnarchiver unarchiveRootObject:data] retain]; 

    // error checking, tell UI to load the new values, etc... 
} 

(kDefaultsKeyModelObjects Luôn luôn đặt các khóa NSUserDefaults của bạn ở một nơi! Có lỗi đánh máy trong một tên khóa có thể mất hàng giờ để gỡ lỗi. :)

Nếu bạn đã sử dụng, ví dụ: SQLite để lưu trữ dữ liệu ứng dụng của bạn , bạn phải viết rất nhiều mã để mov e dữ liệu mô hình của bạn vào và ra khỏi cơ sở dữ liệu. Điều đó có ý nghĩa nếu bạn đang xử lý nhiều dữ liệu, cần tìm kiếm hiệu quả, v.v. nhưng nếu đó là một danh sách các máy chủ trong một ứng dụng mạng thì sẽ dễ dàng hơn và dễ dàng hơn trong các ứng dụng NSUserDefaults.

Một điều cuối cùng: NSUserDefaults thật tuyệt vời cho việc tạo mẫu. Thậm chí nếu bạn biết rằng bạn sẽ cần một cửa hàng SQLite, bạn có thể bắt đầu sử dụng NSUserDefaults như một cửa hàng lưu trữ nhanh và dễ dàng, và làm cho UI của bạn hoạt động và mô hình dữ liệu của bạn bị loại bỏ trước khi viết một loạt mã cơ sở dữ liệu.

Vì vậy, giống như Mac OS X, iOS cũng có nhiều người dùng và tùy thuộc vào bất kỳ tùy chọn nào được đăng nhập NSUserDefaults chọn tùy chọn của anh ấy/cô ấy?

Không, trên iOS plist mặc định nằm trong thư mục Library/Preferences của ứng dụng, không nằm trong thư mục người dùng cụ thể như trên OS X. Tôi không thể tưởng tượng iOS sẽ có nhiều lần đăng nhập, nhưng bạn không bao giờ biết. Nếu nó đã làm, họ sẽ phải thực hiện mặc định riêng biệt plists cho người dùng khác nhau.

Các vấn đề liên quan