键入Swift时搜索

时间:2015-02-09 14:07:33

标签: ios swift search

我尝试在您使用Swift编写的类型中实现搜索。它已经工作但我需要一些调整。我发送每个输入的字母

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

    })
}

我尝试了在此How can I debounce a method call?

找到的Debounce实现

我的问题:

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

请求仅在搜索文本未键入2秒后才开始。因此,如果我是一个快速的typer并且每0.5秒输入一个字母,除非我暂停至少2秒钟,否则永远不会触发请求。

3 个答案:

答案 0 :(得分:7)

您可以使用NSTimer。在textDidChange中启动或无效并重新启动计时器2秒钟。让计时器在实际弹出时触发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")
}

答案 1 :(得分:1)

您遇到的问题是,您每次调用findUser函数之前都要对其进行去抖动。你的去抖动功能设置了初始定时器和延迟,但由于你每次调用它,初始定时器总是“现在”。你应该只去抖一次,这样闭合可以保持其捕获的最后执行时间。

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

class MySearchController: ... {
    lazy var debouncedFindUser = debounce(
        Static.searchDebounceInterval,
        Static.q,
        self.findUser)

    ...

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        debouncedFindUser()
    }

    func findUser() {
        ...
    }
}

答案 2 :(得分:0)

您唯一需要做的就是创建一个计时器

const COURSES_IN_STORAGE = 'courses_in_storage';

@Injectable()
export class CourseService{
...
  courseIdState: string;

  // This method is invokes by the component  
  setId(courseIdValue: string) {
    this.courseId.next(courseIdValue);
    localStorage.setItem(COURSES_IN_STORAGE, courseIdValue);
  }

 constructor() {
    this.courseIdState = localStorage.getItem(COURSES_IN_STORAGE) || {}; 
  }
}