2016-11-25 4 views
5

NSUserDefaultsのsynchronize()メソッドに関するAppleのドキュメントを見てきました。参考のために、以下を参照してください:いつ、なぜNSUserDefaultsのsynchronize()メソッドを使用する必要がありますか?

https://developer.apple.com/reference/foundation/userdefaults/1414005-synchronize

ページに現在の読み込み:

をこのメソッドが自動的に定期的に呼び出されるので、例えば(あなたが自動同期を待つことができない場合にのみ、このメソッドを使用しますアプリケーションが終了しようとしている場合)、または変更を加えていないにもかかわらず、ユーザーのデフォルトをディスク上のものに更新したい場合に使用します。

しかし、私はまだ理解していないことは、このメソッドを呼び出すべきときです。たとえば、ユーザーがアプリの設定を変更するたびに呼び出される必要がありますか?または、私はちょうど背景のAPIがそれを処理することを信頼する必要がありますか?そして、メモリの設定が変更された直後にビューを終了すると、その変更は失われますか?

また、synchronize()を呼び出さないと、ユーザー設定が正しく変更されないことがありますか?

また、このメソッドを呼び出すコスト(パフォーマンス、メモリなど)は何ですか?私はそれがディスクからの読み書きを含んでいることを知っていますが、それは本当に電話で多くの努力をしていますか?

答えて

18

ユーザーのデフォルトに関する混乱が非常にあるようです。これをこのように考えてください。基本的には、アプリ全体で使用できるグローバル辞書を持っているのと同じです。キー/値をグローバルディクショナリに追加/編集/削除すると、その変更はコード内のどこにでもすぐに表示されます。この辞書はメモリに保存されているため、ファイルに保存されていないとアプリが終了するとすべて失われます。 NSUserDefaultsは辞書を自動的にファイルに保存します。

synchronizeメソッドがある唯一の理由は、最終的に自動的に保存されるのを待つのではなく、NSUserDefaultsに辞書「今すぐ」を保持するようにアプリが指示できるからです。

あなたがこれを行う必要がある唯一の理由は、次の自動保存の前にアプリが終了(またはクラッシュ)する可能性があるからです。

私自身のアプリケーションでは、私がsynchronizeと呼ぶ唯一の場所は、applicationDidEnterBackgroundデリゲートメソッドです。これは、バックグラウンドでアプリが終了した場合に保存されていない最新の変更を確実に保持するためです。

私は混乱の多くは、開発中にアプリケーションをデバッグすることから来ていると思います。開発中に、デバッガの「停止」ボタンでアプリを終了させるのは珍しいことではありません。そして、これは何度も、最新のNSUserDefaultsの変更が維持される前に発生します。だから私はバックグラウンドで私は、最新の更新が維持されていることを確認するたびに、デバッガでアプリを殺す前にホームボタンを押すことで私のアプリを置くの習慣を開発しました。上記の概要を考える

、のは、あなたの質問を見てみましょう:それは、ユーザーがアプリの設定を変更するたび

と呼ばれるべき?

No.上記のように、変更は自動的にすぐに利用できます。

また、バックグラウンドAPIがそれを処理すると確信する必要がありますか?

はい、アプリがバックグラウンドに入ったときにsynchronizeを呼び出すことを除いて、自動永続性を信頼してください。

メモリの設定が変更された直後にビューを終了すると、その変更が失われますか?

これは効果がありません。 NSUserDefaultsにキー/値を追加/編集/削除すると、変更が行われます。

また、synchronize()を呼び出さないと、ユーザー設定が正しく変更されない可能性がありますか?

変更が失われるのは、最新の変更が維持される前にアプリが終了した場合だけです。アプリがバックグラウンドに入ったときにsynchronizeを呼び出すと、これらの問題のほとんどが解決されます。残っている唯一の問題は、アプリがクラッシュした場合です。まだ保存されていない変更はすべて失われます。アプリがクラッシュしないように修正してください。

また、このメソッドを呼び出すコスト(パフォーマンス、メモリなど)はどのくらいですか?私はそれがディスクからの読み書きを含んでいることを知っていますが、それは本当に電話で多くの努力をしていますか?

自動永続化はバックグラウンドで実行され、plistファイルに辞書を書き込むだけです。あなたが推奨事項に従わない限り、非常に高速です。大量のデータを格納するためにNSUserDefaultsを悪用すると、処理速度が低下します。

+0

グレート答え!ありがとう、これは私のための多くのものをクリアし、私がすでに読んだことに基づいて多くの意味を作ります。 –

0

私が知っている限り、同期はすぐにデータを同期するために使用されますが、iOSはこれをスマートな方法で処理できます。だから毎回電話する必要はありません。それを毎回呼び出すと、パフォーマンスの問題に変わります。

チェックリンゴのドキュメント: Official Link

関連する問題