ユーザーのデフォルトに関する混乱が非常にあるようです。これをこのように考えてください。基本的には、アプリ全体で使用できるグローバル辞書を持っているのと同じです。キー/値をグローバルディクショナリに追加/編集/削除すると、その変更はコード内のどこにでもすぐに表示されます。この辞書はメモリに保存されているため、ファイルに保存されていないとアプリが終了するとすべて失われます。 NSUserDefaults
は辞書を自動的にファイルに保存します。
synchronize
メソッドがある唯一の理由は、最終的に自動的に保存されるのを待つのではなく、NSUserDefaults
に辞書「今すぐ」を保持するようにアプリが指示できるからです。
あなたがこれを行う必要がある唯一の理由は、次の自動保存の前にアプリが終了(またはクラッシュ)する可能性があるからです。
私自身のアプリケーションでは、私がsynchronize
と呼ぶ唯一の場所は、applicationDidEnterBackground
デリゲートメソッドです。これは、バックグラウンドでアプリが終了した場合に保存されていない最新の変更を確実に保持するためです。
私は混乱の多くは、開発中にアプリケーションをデバッグすることから来ていると思います。開発中に、デバッガの「停止」ボタンでアプリを終了させるのは珍しいことではありません。そして、これは何度も、最新のNSUserDefaults
の変更が維持される前に発生します。だから私はバックグラウンドで私は、最新の更新が維持されていることを確認するたびに、デバッガでアプリを殺す前にホームボタンを押すことで私のアプリを置くの習慣を開発しました。上記の概要を考える
、のは、あなたの質問を見てみましょう:それは、ユーザーがアプリの設定を変更するたび
と呼ばれるべき?
No.上記のように、変更は自動的にすぐに利用できます。
また、バックグラウンドAPIがそれを処理すると確信する必要がありますか?
はい、アプリがバックグラウンドに入ったときにsynchronize
を呼び出すことを除いて、自動永続性を信頼してください。
メモリの設定が変更された直後にビューを終了すると、その変更が失われますか?
これは効果がありません。 NSUserDefaults
にキー/値を追加/編集/削除すると、変更が行われます。
また、synchronize()を呼び出さないと、ユーザー設定が正しく変更されない可能性がありますか?
変更が失われるのは、最新の変更が維持される前にアプリが終了した場合だけです。アプリがバックグラウンドに入ったときにsynchronize
を呼び出すと、これらの問題のほとんどが解決されます。残っている唯一の問題は、アプリがクラッシュした場合です。まだ保存されていない変更はすべて失われます。アプリがクラッシュしないように修正してください。
また、このメソッドを呼び出すコスト(パフォーマンス、メモリなど)はどのくらいですか?私はそれがディスクからの読み書きを含んでいることを知っていますが、それは本当に電話で多くの努力をしていますか?
自動永続化はバックグラウンドで実行され、plistファイルに辞書を書き込むだけです。あなたが推奨事項に従わない限り、非常に高速です。大量のデータを格納するためにNSUserDefaults
を悪用すると、処理速度が低下します。
グレート答え!ありがとう、これは私のための多くのものをクリアし、私がすでに読んだことに基づいて多くの意味を作ります。 –