という名前のクラスがあり、変数はfirstName
とlastName
です。私はreactCocoaフレームワークを使用してこれらの変数の変更を聞いていますが、didSet{}
のようにKVOリッスンのみを使用しているとしましょう。与えられた時間だけ待って最後の関数呼び出しを実行する方法
let firstName:String { didSet{ self.nameDidChange() }}
let lastName: String { didSet{ self.nameDidChange() }}
func nameDidChange(){ print("New name:", firstName, lastName}
私は姓または名のいずれかを変更したいたびに、それは自動的に機能nameDidChange
を呼び出します。だから私はこのコードを持っていると仮定します。 firstName
とlastName
の両方を変更すると、nameDidChange
関数が2回連続して呼び出されないようにスマートな動きがあるのでしょうか?
のはfirstName
の値が"Anders"
で、lastName
が"Andersson"
あるとしましょう、私はこのコードを実行します。
firstName = "Borat"
lastName = "Boratsson"
nameDidChange
は二度ここに呼び出されます。最初に"New name: Borat Andersson"
、次に"New name: Borat Boratsson"
を印刷します。
私の単純な心の中で、私は関数を作成することができます思っていますが、nameIsChanging()
のようなものをと呼ばれる、didSet
のいずれかが呼び出されるたびにそれを呼び出すと、0.1のような第二のタイマーを起動し、その後コールnameDidChange()
が、これらの両方ともdidSet
はnameIsChanging
も呼び出しますので、タイマーは2回進み、両方の時間を起動します。これを解決するために、私は "グローバル" Timer
を保持して、それを無効にしてカウントを再起動することができます。しかし、私が解決策を考えると、もっと醜いことが起こります。ここに「ベストプラクティス」はありますか?
デフォルトで 'false'である' isChangingName'を追加し、 'nameDidChange'でそのように設定すると、' nameIsChanging'が 'false'を保証するために' guard'を使用し、 'true'タイマーや 'perform(、with:、afterDelay:) 'で遅延操作を開始してください。 – theMikeSwan
人為的な遅延を追加することによって、ユーザーはそれを「遅い」、または切断したと感じるかもしれません。実際に関数呼び出しを遅らせる必要はありますか?あなたが遅延ルートを行っている場合は、アプリが何かをしている*いくつかの*視覚的な指示があるはずです。 – Zig
@Zig同時に設定されるので、私はそれを防ぐために0.01秒の遅延が必要です。これは、プログラムで同時に設定されている場合のみです。これとは別に、別々に変更されていれば関数を呼び出す必要があります。それは、それぞれが必要でないときにurlリクエストを発生させないようにするためです。 – Sti