当前位置: 首页 > 面试题库 >

如何消除方法调用的反跳?

翟鸿振
2023-03-14
问题内容

我正在尝试使用A
UISearchView查询Google地方。为此,在UISearchBar发给我的文字更改电话中,我正在向Google地方提出要求。问题是我宁愿将此呼叫退信以每250
ms仅请求一次,以避免不必要的网络流量。我不想自己编写此功能,但是如果需要的话,我会写的。

我发现:https :
//gist.github.com/ShamylZakariya/54ee03228d955f458389,但我不太确定如何使用它:

func debounce( delay:NSTimeInterval, #queue:dispatch_queue_t, action: (()->()) ) -> ()->() {

    var lastFireTime:dispatch_time_t = 0
    let dispatchDelay = Int64(delay * Double(NSEC_PER_SEC))

    return {
        lastFireTime = dispatch_time(DISPATCH_TIME_NOW,0)
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                dispatchDelay
            ),
            queue) {
                let now = dispatch_time(DISPATCH_TIME_NOW,0)
                let when = dispatch_time(lastFireTime, dispatchDelay)
                if now >= when {
                    action()
                }
            }
    }
}

这是我尝试使用上述代码的一件事:

let searchDebounceInterval: NSTimeInterval = NSTimeInterval(0.25)

func findPlaces() {
    // ...
}

func searchBar(searchBar: UISearchBar!, textDidChange searchText: String!) {
    debounce(
        searchDebounceInterval,
        dispatch_get_main_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT),
        self.findPlaces
    )
}

产生的错误是 Cannot invoke function with an argument list of type '(NSTimeInterval, $T5, () -> ())

如何使用此方法,或者在iOS / Swift中有更好的方法来执行此操作。


问题答案:

将其放在文件的 顶层 ,以免使自己与Swift有趣的参数名称规则混淆。请注意,我已经删除了,#因此现在所有参数都没有名称:

func debounce( delay:NSTimeInterval, queue:dispatch_queue_t, action: (()->()) ) -> ()->() {
    var lastFireTime:dispatch_time_t = 0
    let dispatchDelay = Int64(delay * Double(NSEC_PER_SEC))

    return {
        lastFireTime = dispatch_time(DISPATCH_TIME_NOW,0)
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                dispatchDelay
            ),
            queue) {
                let now = dispatch_time(DISPATCH_TIME_NOW,0)
                let when = dispatch_time(lastFireTime, dispatchDelay)
                if now >= when {
                    action()
                }
        }
    }
}

现在,在您的实际课程中,您的代码将如下所示:

let searchDebounceInterval: NSTimeInterval = NSTimeInterval(0.25)
let q = dispatch_get_main_queue()
func findPlaces() {
    // ...
}
let debouncedFindPlaces = debounce(
        searchDebounceInterval,
        q,
        findPlaces
    )

现在debouncedFindPlaces是一个可以调用的函数,findPlaces除非delay自上次调用以来已经通过,否则将不会执行您的函数。



 类似资料:
  • 问题内容: 我有两节课: 我有一个实例B。如何调用A.method()从b?基本上,效果与super.method()从调用相同B。 但是上述代码仍会调用。 问题答案: 如果使用的是JDK7,则可以使用MethodHandle实现此目的:

  • 问题内容: 如何使用反射调用带有参数的方法? 我想指定这些参数的值。 问题答案: 这是一个使用涉及原语的反射调用方法的简单示例。 要健壮,应该捕获和处理所有检查反射有关的异常,,。

  • 问题内容: 我在递归反射函数中调用方法时遇到麻烦。这里是: 我用以下函数调用该函数: 我希望获得的解析方法在我正在打印方法的地方,并针对它运行.Call()。相反,它是打印出来的:我不能反对。 我想我无法将每个方法的返回值都放在头上。我知道我必须使用ValueOf来提取值,但似乎我尝试了任何置换,都是从反射类本身获取方法的:-p 感叹 问题答案: 问题在于该方法在指针接收器上,但是该函数正在与赋值

  • 问题内容: 当使用反射从另一个主要方法调用Java类的主要方法时, 我应该创建newInstance()还是直接调用main(),因为它是静态的。 问题答案: 对于您陈述的要求(动态地调用随机类的main方法,通过反射,您有很多不必要的代码。 您不需要为该类调用构造函数 您不需要内省类字段 由于您正在调用静态方法,因此甚至不需要真正的对象来调用该方法。 您可以修改以下代码来满足您的需求:

  • 问题内容: 我试图以反射方式在Java中调用此方法: 问题是我想将null传递为,以便foo变为null。 但是,在以下方法中,它假定没有参数,并且我得到(): 这是如何完成的? 问题答案: 尝试

  • 我用java反射写了下面的代码。在这段代码中,我调用了有参数的方法1(),代码运行时没有错误。没关系。但是我如何调用没有参数的方法2()和方法3()呢?如何在java反射中调用没有参数的方法?Java支持这样的功能吗?