2016-07-26 4 views
1

こんにちは私は検索バーでデータを検索/フィルタするテーブルビューを実装しようとしています。アイデアは、ユーザーが検索バーに挿入するすべての文字(または文字のグループ)に対して、アプリがRESTクエリをサーバーに送信し、データがテーブルビューに表示されることです。Swift 2 - RESTサービスとTableViewで検索バーによってフィルタリングされる

問題は、テーブルが更新されないことです。たとえば、検索バーに「Marco」を挿入すると、新しい文字を挿入した後にのみ表にデータが表示されます。テーブルビューは1ステップ遅れて同期されているようです。

私の実装はこれです、何が間違っていますか?

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 
    } 
} 
+0

検索バー/検索コードが見つかりませんでしたか?あなたはそれを追加できますか? –

答えて

0

あなたが直面している主な問題は、あなたが代わりにコードの下に検索バーの使用のtextDidChagnedデリゲートを実装している、それはあなたのために働くだろうからです。

乾杯!

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) 
    } 
+0

Tnxは動作します。実際に私はこれを使った: 'textFieldString =(NSStringとしてのsearchText).stringByReplacingCharactersInRange(range、withString:text)' –

関連する問題