search你inputSwift

我试图在Swift中input时inputSearch。 它已经工作,但我需要一些调整。 我input每个字母

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { let debouncedFindUser = debounce( Static.searchDebounceInterval, Static.q, findUser) debouncedFindUser() } 

一个请求到后端。

 func findUser() -> () { SearchService.sharedInstance.getUser(0, numberOfItems: 100, searchString: searchUserBar.text.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! , success: {SearchUserDto -> Void in if self.searchUserBar.text != nil { self.updateSearch() } }, failure: {NSError -> Void in }) } 

我尝试了在这里find的Debounce的实现我怎样才能消除方法调用?

我的问题:

如果在特定时间内触发了方法调用,我想要“重新启动”方法调用。 所以让我们夸张一点。

该请求只能在search文本未input2秒后才能启动。 所以,如果我是一个快速的typer,每0.5秒键入一个字母的请求应该永远不会被触发,除非我暂停至less2秒。

你可以使用NSTimer。 启动或无效,并在您的textDidChange重新启动计时器2秒。 让计时器在实际popup时触发findUser方法。

  var debounceTimer: NSTimer? @IBAction func test() { if let timer = debounceTimer { timer.invalidate() } debounceTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("getUser"), userInfo: nil, repeats: false) NSRunLoop.currentRunLoop().addTimer(debounceTimer!, forMode: "NSDefaultRunLoopMode") } func getUser() { println("yeah") } 

你遇到的问题是你每次调用之前都会findUser函数。 你的去抖动function设置了初始定时器和延迟,但是由于你每次都调用它,初始定时器总是“现在”。 你应该只有一次反弹,以便closures可以保持其捕获的最后执行时间。

你只想一次调用debounce ,并将其作为一个属性存储,如下所示:

 class MySearchController: ... { lazy var debouncedFindUser = debounce( Static.searchDebounceInterval, Static.q, self.findUser) ... func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { debouncedFindUser() } func findUser() { ... } }