使用Swift查找用户是不是已经显示在TableView中[重复]

Posted

技术标签:

【中文标题】使用Swift查找用户是不是已经显示在TableView中[重复]【英文标题】:Find if user is already displayed in TableView using Swift [duplicate]使用Swift查找用户是否已经显示在TableView中[重复] 【发布时间】:2017-12-12 13:28:00 【问题描述】:

我正在编写一个允许搜索特定用户的 viewController。我有一个 searchBar 和一个监听器:

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 queryUsers(withText text: String, completion: @escaping (Userm) -> Void) 
      REF_USERS.queryOrdered(byChild: "username_lowercase").queryStarting(atValue: text).queryEnding(atValue: text+"\uf8ff").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() 函数,但效果不佳,我还是 Swift 的初学者。

请问你有什么想法吗?

【问题讨论】:

我找到了一个主题来回答我的问题:***.com/questions/24330056/… 我尝试了你的答案,但效果不佳。非常感谢。 【参考方案1】:

您可以选择过滤 TableView 用来显示数据的数组。这可以通过将其转换为 Set(因为 Set 仅包含唯一值)然后再次返回到 Array 来完成,或者通过对 User 类进行扩展以使其符合 Equatable 协议。可以像这样使用 set 选项:

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
    

【讨论】:

【参考方案2】:

我认为您可以使用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。

【讨论】:

以上是关于使用Swift查找用户是不是已经显示在TableView中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在位置管理器功能swift 3中使用用户位置

Swift - 使用计时器检测用户不活动,然后在 4 分钟后显示警报以提示用户是不是仍然存在

FBSDK 检查用户是不是已经授权应用程序 Swift

无法在 View Controller iOS Swift 中显示 TabBar

Firebase 查询(在 Swift 中)在应用的所有用户中查找特定值

检查用户名是不是已经存在:Swift、Firebase