使用搜索栏时表格视图中的重复项目

Posted

技术标签:

【中文标题】使用搜索栏时表格视图中的重复项目【英文标题】:Duplicate item in tableview when using searchbar 【发布时间】:2016-06-06 01:12:17 【问题描述】:

这是我使用的搜索栏委托

 func searchBar(searchBar: UISearchBar, textDidChange searchText: String) 
        if searchText.characters.count >= 2 
        self.setupinbox(searchText)
        
    

这是从服务器获取数据的函数

func setupinbox(q : String) 

        arrayOfRels.removeAll(keepCapacity: false)
        self.tableView.reloadData()

        let session = NSURLSession.sharedSession()
        let request = NSMutableURLRequest(URL: NSURL(string: "URL")!)
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.HTTPMethod = "POST"
        let data = "devicetoken=\(devicetoken!)&q=\(q)&user_id=\(userid)"
        request.HTTPBody = data.dataUsingEncoding(NSUTF8StringEncoding)

        let task = session.dataTaskWithRequest(request, completionHandler: (data, response, error) in
            if let error = error 
                print(error)
            

            if let response = response 

                let res = response as! NSHTTPURLResponse

                dispatch_async(dispatch_get_main_queue(), 
                    if (res.statusCode >= 200 && res.statusCode < 300)
                    

                        do 
                            let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers ) as! NSArray
                            let json = JSON(jsonData)

                            for (_, subJSON): (String, JSON) in json[0]["interests"] 

                                let title = subJSON["title"].string
                                let eID = subJSON["ID"].string
                                let count = subJSON["count"].string
                                let rel1 = InboxInterests(title: title!,eventID : NSInteger(eID!)!, count: count!)
                                self.arrayOfRels.append(rel1)

                            

                         catch let error as NSError 
                            print(error)
                        

                        self.tableView.reloadData()

                     else 

                        let alert = UIAlertController(title: "Error", message: "Connection Failed", preferredStyle: .Alert)

                        alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler:  (action: UIAlertAction) in

                        ))
                        self.presentViewController(alert, animated: true, completion: nil)
                    
                    
                )
        )
        task.resume()

    

当我慢慢键入搜索栏时,一切正常,我可以正确看到结果。

但是当我快速输入 2 个字母时,我得到了重复的项目。

当我快速删除字母时,我也会得到重复的项目

尝试了类似延迟textDidChange 的方法,但没有奏效。

知道是什么原因造成的,我该如何解决?

【问题讨论】:

你在 arrayOfRels 有 2 个项目吗? 您正在异步加载数据。您不应该在开始新的请求之前取消任何待处理的请求吗? @Sebastian 是的,当我快速键入时,我意识到数组有 2 个项目 @beyowulf 你能告诉我怎么做吗? 您可以创建一个NSURLSessionTask? 属性。类似“currentTask”的东西。这将允许您保留对最近获取请求的引用。在setupInbox开头可以取消self.currentTask.cancel() 【参考方案1】:

你应该多写一行代码:

do 
arrayOfRels.removeAll(keepCapacity: false)
........

【讨论】:

这对于一个玩具项目可能就足够了,但它不可扩展。 @NRitH 你能告诉我防止这种情况的最佳方法是什么吗?

以上是关于使用搜索栏时表格视图中的重复项目的主要内容,如果未能解决你的问题,请参考以下文章

点击标签栏时将表格视图滚动到顶部

iOS:在导航栏中显示搜索栏时隐藏范围栏

单击搜索结果时显示空的详细信息视图

单击搜索栏时如何导航到另一个视图控制器

单击搜索栏时如何显示单独的视图? [SwiftUI] [关闭]

android - 搜索列表视图?