Swift – 如何使用Firebase中的“shouldChangeTextInRange”进行实时search?
我想知道如何创buildFirebase matchesRegex查询并使用shouldChangeTextInRange 列出当前结果 。
在Parse Cloud中,我已经在Parse中search用户名或用户全名了。 如果有人点亮了我在Firebase中的路线,那就太好了。
// search updated func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { // find by username let usernameQuery = PFQuery(className: "_User") usernameQuery.whereKey("username", matchesRegex: "(?i)" + searchBar.text!) usernameQuery.findObjectsInBackgroundWithBlock { (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { // if no objects are found according to entered text in username column, find by fullname if objects!.isEmpty { let fullnameQuery = PFUser.query() fullnameQuery?.whereKey("fullname", matchesRegex: "(?i)" + self.searchBar.text!) fullnameQuery?.findObjectsInBackgroundWithBlock({ (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { // clean up self.usernameArray.removeAll(keepCapacity: false) self.avaArray.removeAll(keepCapacity: false) // found related objects for object in objects! { self.usernameArray.append(object.objectForKey("username") as! String) self.avaArray.append(object.objectForKey("avatar") as! PFFile) } // reload self.tableView.reloadData() } }) } } // clean up self.usernameArray.removeAll(keepCapacity: false) self.avaArray.removeAll(keepCapacity: false) // found related objects for object in objects! { self.usernameArray.append(object.objectForKey("username") as! String) self.avaArray.append(object.objectForKey("avatar") as! PFFile) } // reload self.tableView.reloadData() } return true }
更新1:
我不能使用相同的父母名称,snap.value没有给我的回应,甚至没有编译。 所以我试图做两个单独的父节点,如: firebase截图
我正在为 xcode console上的每个字母描边 first_name子节点获取indexOn安全警告 :
[Firebase]使用未指定的索引。 考虑在/ people_spell中添加“.indexOn”:“first_name / T”以符合您的安全规则,以获得更好的性能
[Firebase]使用未指定的索引。 考虑在/ people_spell中添加“.indexOn”:“first_name / Te”到您的安全规则以获得更好的性能
…更多的时间
我已经尝试过这些安全规则 ,但没有解决这些问题。 它不包含每个子节点。 我怎样才能提供这个?
"people_spell": { ".read": "auth !== null", ".write": "auth !== null", ".indexOn": "first_name" }, "people": { ".read": "auth !== null", ".write": "auth !== null", ".indexOn": "first_name" }
我正在使用这些代码行:
let peopleSpellRef = Firebase(url: "https://sampleproject.firebaseio.com/people_spell") let peopleRef = Firebase(url: "https://sampleproject.firebaseio.com/people") func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { self.usernameArray.removeAll(keepCapacity: false) peopleSpellRef.queryOrderedByChild("first_name/\(searchBar.text!)").queryEqualToValue(true) .observeEventType(.Value, withBlock: { snapshot in let enumerator = snapshot.children while let rest = enumerator.nextObject() as? FDataSnapshot { peopleRef.childByAppendingPath("\(rest.key)").observeEventType(.Value, withBlock: { snapshot in self.usernameArray.removeAll(keepCapacity: false) let str: String = (snapshot.value.objectForKey("first_name")) as! (String) print(str) self.usernameArray.append(str) self.userkeyArray.append(snapshot.key) self.tableView.reloadData() }) } self.usernameArray.removeAll(keepCapacity: false) self.tableView.reloadData() }) return true }
这不是Firebase的工作原理,您无法直接在Firebase中为子string进行“实时search”。 但是,您可以设置要search的Firebase数据的格式,还有其他一些方法也可以实现目标。
一个很简单:从Firebase将数据加载到数组中,并通过数组从NSPredicatesearch(或其他方法)。
另一个是查询完整string很容易; 只要文本被分解为要search的块:
people person_0 first_name: "Ted" last_name: "Stryker" position: "sitting down and facing front" person_1 first_name: "Teddy"
您可以在first_name中search“Ted”或在last_name中search“Stryker”,但无法在位置search“front”。
现在,解决方法并记住磁盘空间是便宜的。
可以创build一个节点,让您以各种方式search内容
people person_0 first_name //First name is Ted from above T: true Te: true Ted: true ed: true d: true e: true person_1 first_name //First name is Teddy from above T: true Te: true Ted: true etc
有了这个结构,我们可以find以Ted开头的所有名字
peopleRef.queryOrderedByChild("first_name/Ted").queryEqualToValue(true) .observeEventType(.Value, withBlock: { snapshot in for child in snapshot.children { print(child.value) } })
其他search可以执行; search所有包含e或Te等的名字
如果这纯粹是您正在search在文本字段中执行自动填充的情况(例如)通过按键击键击键的Firebase将无法正常工作。
将Firebase中的数据加载到数组或字典(或其他)中可能是您的最佳解决scheme。