【发布时间】:2017-11-07 17:07:44
【问题描述】:
假设我有一个名为Person 的类,其中包含firstName 和lastName 之类的变量。我正在使用响应式Cocoa 框架来监听这些变量的变化,但假设我只使用内置的 KVO 监听,例如 didSet{}。所以假设我有这个代码:
let firstName:String { didSet{ self.nameDidChange() }}
let lastName: String { didSet{ self.nameDidChange() }}
func nameDidChange(){ print("New name:", firstName, lastName}
每次我更改名字或姓氏时,它都会自动调用函数nameDidChange。
我想知道的是,当我同时更改firstName 和lastName 时,这里是否有任何聪明的举措来防止nameDidChange 函数被连续调用两次。
假设firstName 中的值是"Anders" 和lastName 是"Andersson",那么我运行这段代码:
firstName = "Borat"
lastName = "Boratsson"
nameDidChange 将在这里调用两次。它将首先打印出"New name: Borat Andersson",然后是"New name: Borat Boratsson"。
在我的简单想法中,我想我可以创建一个名为 nameIsChanging() 之类的函数,在任何 didSet 被调用时调用它,并启动一个 0.1 秒的计时器,然后 调用nameDidChange(),但是这两个didSets 也会调用nameIsChanging,所以定时器会走两次,两次都触发。为了解决这个问题,我可以保留一个“全局”Timer,并使其自身失效并重新开始计数或类似的东西,但我越想解决方案,它们就越难看。这里有什么“最佳实践”吗?
【问题讨论】:
-
您可以添加一个布尔值
isChangingName,即默认为false,并在nameDidChange中设置该方式,然后nameIsChanging可以使用guard来确保它是false,将其设置为true,然后使用定时器或perform( , with: , afterDelay: )开始延迟操作 -
我认为您应该记住,通过添加人为延迟,用户可能会将其解释为感觉“慢”或断开连接。真的需要延迟调用函数吗?如果你确实走延迟路线,应该有一些视觉指示表明应用正在做某事。
-
@Zig 我只需要 0.01 秒的延迟来防止它,因为它们将同时设置。这仅适用于同时以编程方式设置它们的情况。除此之外,如果它们也被单独更改,我还需要它们调用该函数。这是为了防止他们每个人在不需要时触发 url 请求。
标签: ios swift key-value-observing