私はiOS開発とモバイルアプリ開発全般に不慣れで、使用するObjective CとMVCパターンについて十分な知識があり、Mac開発を行ったことがありません。
NSUserDefaults
の目的を理解するのに苦労していますか?
データをXMLとして格納するPListのようなものがすでにあり、そのようなデバイス用の軽量DBであるSQLite
があります。
では、なぜそれがあるのでしょうか。
RDBMSやKey-ValueベースのNoSQLストアなど、クラウド上にさまざまなタイプのストレージがあるのと同じように、これはアプリの代替の単純なKey-Valueストレージですか?
NSUserDefaults
の場合、Appleドキュメントによると:-
"アプリケーションは、ユーザーのデフォルトデータベースのパラメータセットに値を割り当てることにより、このような設定を記録します"
ユーザーのデフォルトデータベースとはどういう意味ですか?
私の推測では、他のマルチユーザーオペレーティングシステムと同様に、さまざまなユーザーアカウントがあり、Macでも同じように、アプリケーションがそのユーザーの保存された設定をロードするデータベースをそれぞれが持つ複数のユーザーがいる可能性があります。
Mac OS Xと同様に、iOSにも複数のユーザーがいて、ログインしているユーザーに応じてNSUserDefaults
が好みを選択しますか?
私が間違っているかどうか教えてください。
NSUserDefaultsは、アプリが正しく実行されるために依存しているデータのごく一部を保存するために使用されますが、他のアプローチは、アプリが動作する大量のデータを保存するのに適しています。
NSUserDefaultsを使用すると、ファイル、エンティティ、フェッチなどについて心配する必要がないため、非常に簡単になります。それはすべて1行で行われます。
まだ言及されていないことの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を作成しなければならないでしょう。
もともとは設定を保存するためのものですが、SO)に関する質問があれば、他の多くのことに(ab)使用されるようです。それの「ポイント」はそれですさまざまなデータ型に対して単一行のデータ永続化および取得方法を提供します。
NSUserDefaultsに組み込まれているiOSにはマルチユーザー構成はありません(まだ?)(iPhoneにサインインする必要がありましたか?)が、OSXとiOSは同じ基盤、同じクラスが両方のオペレーティングシステムに使用されます。
iOSはシングルユーザーOSです。したがって、NSUserDefaultsはOSXとiOSで異なる方法で使用されます。
IOSでは、通常、NSUserDefaultsを使用して、アプリケーション設定やユーザーデータを「iOSデフォルトシステム」に保存します。デフォルトのシステムに保存されたデータは、iOSデバイスを再起動しても常に保持されます。実際のところ、ユーザーがアプリケーションを更新した場合でも。
通常、NSUserDefaultsを使用して、アプリケーションの設定/設定を保存します。ゲームデータやリアルタイム計算などの他の大量のデータは、ドキュメントディレクトリのCoreDataまたはsqlliteに保存する必要があります。
NSUserDefaults
アプリケーションのみの保存値。
注-これは、従来のデータストアの代わりとなることを意図したものではありません(コアデータ、SQLite、プロパティリストなどは、アプリケーションデータを格納するためのものです)。 NSUserDefaults
の意味は、特定のキーと値のペアを対象としています。
たとえば、ログインプロセスが完了すると、認証されたユーザーのネットワークIDとフルネームを保存するために使用します。セッションのタイムアウトまたはログアウト時に、これらの値をクリアします。このためにNSUserDefaults
が輝いています。