2017-12-12 6 views
0

具体的なユーザーを検索することを許可するviewControllerをコーディングしています。Swiftを使用してTableViewにユーザーが既に表示されているかどうかを確認

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() 
     }) 
     } 
} 

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

問題は、私はあまりにも速く書くとき、私は、同じユーザーが複数回表示させることができ、Firebaseと、ということです私は検索バーとリスナーを持っています。

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

私は.contains()関数を使用しようとしましたが、私は良い結果に到着していないが、私はまだスウィフトで初心者だ:私はこのような何かを行うことができます機能を持っていると思います。

お願いしますか?

+0

問題に反応するトピックが見つかりました:https://stackoverflow.com/questions/24330056/how-to-throttle-search-based-on-typing-speed-in-ios-uisearchbarそれはうまくいきませんでした。どうもありがとうございました。 – KevinB

答えて

0

TableViewでデータを表示するために使用する配列をフィルタリングすることができます。これはSetにキャストするか(セットには一意の値しか含まれないため)、次にArrayに戻るか、またはユーザークラスの拡張子を使用してEquatableプロトコルに準拠するかのいずれかで行うことができます。セットオプションを使用すると、次のように行うことができます。

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

このようになりますプロトコルを使用:

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

は、私はあなたが有効な配列を得るためにfiltersを使用することができると思います。このような

何か:あなたが特定の要素を追加したい場合は

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] 

だから、その後、あなただけの追加。

filteredArray.append(someObject); 

他のタイプ(文字列、intなど)でも使用できます。 Swift 3 filter array of objects with elements of array

JLU:

は、あまりにも、ここに助けを得ます。

関連する問題