ios - Swift 2 - REST 服务和由搜索栏过滤的 TableView

标签 ios swift uitableview

您好,我正在尝试实现一个通过搜索栏搜索/过滤数据的表格 View 。这个想法是,对于用户在搜索栏中插入的每个字符(或字符组),应用程序都会向服务器发送一个 REST 查询,并将数据显示在 TableView 中。

问题是表格没有刷新。例如,如果我在搜索栏中插入“Marco”,表格只会在我插入新字符后显示数据。看起来 TableView 同步落后了一步。

我的实现是这样的,有什么问题吗?

class MyViewController: UITableViewController, UISearchBarDelegate {

var queue = NSOperationQueue()

var scrollId: String?
var data: Array<String> = []

override func viewDidLoad()
{
    super.viewDidLoad()
    queue.maxConcurrentOperationCount = 1        
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()        
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.data.count        
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

    let f = self.data[indexPath.row]
    cell.textLabel?.text = f

    return cell
}


override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if (indexPath.row != data.count - 1) {
        return
    }
    if (scrollId != nil) {
       getMoreDataAndRefresh(self.scrollId!)
    }
}      

internal func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    getFoodAndRefreshTable(searchText);
}




///////////////////////////////////

private func getMoreDataAndRefresh(scrollId:String) -> Void {

    let downloadFood = NSBlockOperation(block: {

        let wrap:Wrap = self.getFoodAndAwaitTermination(nil, scrollId: self.scrollId)
        if wrap.error != nil {                
            print("Opsss!: \(wrap.error)")
            return
        }

        NSOperationQueue.mainQueue().addOperationWithBlock({
            if (wrap.data != nil) {
                self.data.appendContentsOf(wrap.data!)                    
                self.tableView.reloadData()
            }
        })

    })
    queue.addOperation(downloadFood)
}


private func getFoodAndRefreshTable(searchText:String?) -> Void {
    let downloadFood = NSBlockOperation(block: {

        let wrap:Wrap = self.getFoodAndAwaitTermination(searchText, scrollId: nil)

        if wrap.error != nil {            
            print("Opsss!: \(wrap.error)")
            return
        }

        NSOperationQueue.mainQueue().addOperationWithBlock({
            if self.scrollId != nil {
                dataAccess.clearRequest(self.scrollId!)
            }
            self.scrollId = wrap.scrollId;
            if (wrap.data != nil) {

                self.data.removeAll()
                self.data.appendContentsOf(wrap.data!)
            }

            self.tableView.reloadData()                
        })            
    })        
    queue.addOperation(downloadFood)       
}


private func getFoodAndAwaitTermination(text:String?, scrollId:String?) -> Wrap {

    let semaphore = dispatch_semaphore_create(0);
    var s:String?
    var r:Array<String> = []
    var e:String?

    dataAccess.getAllFood(text, scrollId : scrollId, pageSize: 20) { (result, scrollId, error) in
        if (error != nil ) {                
            e = error!
        } else {                
            s = scrollId!
            r.appendContentsOf(result!)                
        }         
        dispatch_semaphore_signal(semaphore);
    }

    let timeout = dispatch_time(DISPATCH_TIME_NOW, 20000000000)               
    let res = dispatch_semaphore_wait(semaphore, timeout);        
    return Wrap(food: r, scrollId: s, error: e)       

}


class Wrap {
    var data:Array<String>?
    var scrollId:String?
    var error:String?


    init(food:Array<String>?, scrollId:String?, error:String?) {
        self.data = data
        self.scrollId = scrollId
        self.error = error
    }
}

最佳答案

您面临的主要问题是,您已经实现了搜索栏的 textDidChagned 委托(delegate),改用下面的代码,它会为您工作。

干杯!

func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

        var textFieldString : String = ""
        if let searchText = searchBar.text {
            textFieldString = searchText+text
        } else {
            textFieldString = text
        }
        getFoodAndRefreshTable(textFieldString)
    }

关于ios - Swift 2 - REST 服务和由搜索栏过滤的 TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38586844/

相关文章:

swift - 如何快速过滤 UITableView 中的多个字段

ios - 如何在 Swift 4 中设置从 collectionView 底部到 Input Accessory View 顶部的约束

ios - 自动布局问题 - 垂直间距

ios - 使用 UIButton 转接 TableViewCell

ios - 自定义测量单位

arrays - 如何在swift中将字典追加到数组中

ios - 在 Objective-C 中使用 block 传递数据

ios - 如何使用已解析的 XML 填充表格 View ?

ios - AUGraph 和流式音频(http 和 ets)

ios - 从 Nsnumber 转换为数据以将 rssi 发送到蓝牙模块 IOS swift 4