web-dev-qa-db-ja.com

iOSでNSUserDefaultsが使用されるのはなぜですか?

私はiOS開発とモバイルアプリ開発全般に不慣れで、使用するObjective CとMVCパターンについて十分な知識があり、Mac開発を行ったことがありません。

NSUserDefaultsの目的を理解するのに苦労していますか?

データをXMLとして格納するPListのようなものがすでにあり、そのようなデバイス用の軽量DBであるSQLiteがあります。

では、なぜそれがあるのでしょうか。

RDBMSやKey-ValueベースのNoSQLストアなど、クラウド上にさまざまなタイプのストレージがあるのと同じように、これはアプリの代替の単純なKey-Valueストレージですか?

NSUserDefaultsの場合、Appleドキュメントによると:-

"アプリケーションは、ユーザーのデフォルトデータベースのパラメータセットに値を割り当てることにより、このような設定を記録します"

ユーザーのデフォルトデータベースとはどういう意味ですか?

私の推測では、他のマルチユーザーオペレーティングシステムと同様に、さまざまなユーザーアカウントがあり、Macでも同じように、アプリケーションがそのユーザーの保存された設定をロードするデータベースをそれぞれが持つ複数のユーザーがいる可能性があります。

Mac OS Xと同様に、iOSにも複数のユーザーがいて、ログインしているユーザーに応じてNSUserDefaultsが好みを選択しますか?

私が間違っているかどうか教えてください。

24

NSUserDefaultsは、アプリが正しく実行されるために依存しているデータのごく一部を保存するために使用されますが、他のアプローチは、アプリが動作する大量のデータを保存するのに適しています。

NSUserDefaultsを使用すると、ファイル、エンティティ、フェッチなどについて心配する必要がないため、非常に簡単になります。それはすべて1行で行われます。

14
vikingosegundo

まだ言及されていないことの1つ:NSUserDefaultsは、すべての基本的なスカラー(float、int、BOOL)タイプと、plist互換タイプ(NSData、NSString、NSNumber、NSDate、NSArray、およびNSDictionary)をサポートします。 (代替としてplistについて言及しました。NSUserDefaultsは、アプリケーションのPreferencesフォルダーにある標準のplistファイルのフロントエンドにすぎません。)これにより、わずか数行のコードでアプリケーションの状態の永続ストレージを簡単に作成できます。さらに良いことに、モデルオブジェクトにNSCodingを実装すると、それらをNSDataにアーカイブして、NSUserDefaultsに配置できます。

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects];

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

アプリのデータを復元するのは簡単です

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

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

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

(kDefaultsKeyModelObjectsは、どこかで定義した文字列定数です。常にNSUserDefaultsキーを1か所に配置してください!キー名にタイプミスがあると、デバッグに数時間かかる場合があります。:)

SQLiteなどを使用してアプリケーションデータを保存した場合、モデルデータをデータベースに出し入れするために多くのコードを記述する必要があります。これは、大量のデータを処理している場合、効率的な検索が必要な場合などに意味があります。ただし、たとえば、ネットワーキングアプリ内のサーバーのリストの場合は、NSUserDefaultsにサーバーをスローする方が簡単でクリーンです。

最後にもう1つ、NSUserDefaultsはプロトタイピングに最適です。最終的にSQLiteストアが必要になることがわかっている場合でも、NSUserDefaultsをすばやく簡単な永続ストアとして使用し、一連のデータベースコードを作成する前に、UIを機能させてデータモデルを具体化することができます。

Mac OS Xと同様に、iOSにも複数のユーザーがいて、ログインしているユーザーに応じてNSUserDefaultsが好みを選択しますか?

いいえ、iOSではデフォルトのplistはアプリケーションのLibrary/Preferencesフォルダーにあり、OS Xのようにユーザー固有のフォルダーにはありません。iOSに複数のログインがあるとは想像できませんが、わかりません。もしそうなら、彼らは異なるユーザーのために別々のデフォルトのplistを作成しなければならないでしょう。

15
davehayden

もともとは設定を保存するためのものですが、SO)に関する質問があれば、他の多くのことに(ab)使用されるようです。それの「ポイント」はそれですさまざまなデータ型に対して単一行のデータ永続化および取得方法を提供します。

NSUserDefaultsに組み込まれているiOSにはマルチユーザー構成はありません(まだ?)(iPhoneにサインインする必要がありましたか?)が、OSXとiOSは同じ基盤、同じクラスが両方のオペレーティングシステムに使用されます。

5
jrturton

iOSはシングルユーザーOSです。したがって、NSUserDefaultsはOSXとiOSで異なる方法で使用されます。

IOSでは、通常、NSUserDefaultsを使用して、アプリケーション設定やユーザーデータを「iOSデフォルトシステム」に保存します。デフォルトのシステムに保存されたデータは、iOSデバイスを再起動しても常に保持されます。実際のところ、ユーザーがアプリケーションを更新した場合でも。

通常、NSUserDefaultsを使用して、アプリケーションの設定/設定を保存します。ゲームデータやリアルタイム計算などの他の大量のデータは、ドキュメントディレクトリのCoreDataまたはsqlliteに保存する必要があります。

3

NSUserDefaultsアプリケーションのみの保存値。

注-これは、従来のデータストアの代わりとなることを意図したものではありません(コアデータ、SQLite、プロパティリストなどは、アプリケーションデータを格納するためのものです)。 NSUserDefaultsの意味は、特定のキーと値のペアを対象としています。

たとえば、ログインプロセスが完了すると、認証されたユーザーのネットワークIDとフルネームを保存するために使用します。セッションのタイムアウトまたはログアウト時に、これらの値をクリアします。このためにNSUserDefaultsが輝いています。

1
LJ Wilson