使用搜索栏时表格视图中的重复项目
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 你能告诉我防止这种情况的最佳方法是什么吗?以上是关于使用搜索栏时表格视图中的重复项目的主要内容,如果未能解决你的问题,请参考以下文章