2017-12-12 4 views
0

angezeigt wird. Ich bin einen ViewController codieren, die spezifische Benutzer suchen können. Ich habe einen SearchBar und einen Hörer:Finden Sie, ob der Benutzer bereits in TableView mit Swift

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
     doSearch() 
} 

func doSearch() { 
     if let searchText = searchBar.text?.lowercased() { 
     self.users.removeAll() 
     self.tableView.reloadData() 
     Api.User.queryUsers(withText: searchText, completion: { (user) in 
       self.users.append(user) 
       self.tableView.reloadData() 
     }) 
     } 
} 

Die queryUser func:

func queryUsers(withText text: String, completion: @escaping (Userm) -> Void) { 
     REF_USERS.queryOrdered(byChild: "username_lowercase").queryStarting(atValue: text).queryEnding(atValue: text+"\u{f8ff}").queryLimited(toLast: 5).observeSingleEvent(of: .value) { (snapshot) in 
     snapshot.children.forEach({ (s) in 
      let child = s as! DataSnapshot 
      if let dict = child.value as? [String: Any] { 
       let user = Userm.transformUser(dict: dict, key: child.key) 
       completion(user) 
      } 
     }) 
     } 
} 

Das Problem ist, dass mit Firebase, wenn ich zu schnell schreiben kann ich die gleichen Benutzer mehrmals angezeigt haben. Ich möchte eine Funktion haben, die so etwas tun kann:

// if user is not already contained in the array 
-> Display it 

Ich versuchte, die .contains zu verwenden() -Funktion, aber ich habe nicht zu einem guten Ergebnis gekommen, ich bin noch ein Anfänger in Swift.

Haben Sie eine Idee, bitte?

+0

Ich fand ein Thema, das auf mein Problem reagieren: https://StackOverflow.com/Questions/24530056/How-to-Throttle-Search-Based-on-Typing-Speed-in-IsoSearchbar Ich versuchte Ihre Antworten aber es hat nicht gut funktioniert. Vielen Dank. – KevinB

Antwort

0

Sie können das Array filtern, mit dem TableView Daten anzeigt. Dies kann entweder durch Umsetzen auf Set (da Sets nur eindeutige Werte enthalten) und dann wieder zurück auf Array oder mit einer Erweiterung auf die User-Klasse erfolgen, damit sie dem Equatable-Protokoll entspricht.

let array = ["one", "one", "two", "two", "three", "three"] 
let unique = Array(Set(array)) 
// ["one", "two", "three"] 

das Protokoll verwenden würde wie folgt aussehen:: Mit der Set-Option kann wie folgt durchgeführt werden

extension User: Equatable { 
    static func == (lhs: User, rhs: User) -> Bool { 
    //make sure the User class has something that can uniquely identify them. 
     return lhs.identifier == rhs.identifier 
    } 
} 
0

Ich glaube, Sie filters können eine gültige Array zu erhalten.

etwas wie folgt aus:

var someObject:SomeObject = receivedObjectFromMars 
var arrayOfObjects:Array<SomeObject> = [object1, object2, object3, object4] 
// imagine that 'someObject' has the same email of object1 and object 4. 
var filteredArray:Array<String> = []; 

filteredArray = arrayOfObjects.filter({ (obj) -> Bool in 
    //so when you filter the array, you will compare a specific 
    // attribute (e.g: email) 
    return obj.email != someObject.email 
}) 

// current filteredArray = [object2, object3] 

Also, danach, wenn Sie das spezifische Element hinzufügen möchten, können Sie einfach hinzufügen.

filteredArray.append(someObject); 

Sie können es mit anderen Typen verwenden, wie Strings, Int, was auch immer.

Hilfe bekommen auch hier: Swift 3 filter array of objects with elements of array

JLU.

Verwandte Themen