我有一个用户对象,它包含几个字段,例如名称,电子邮件和一个存储字符串数组的职业字段。
用户创建帐户时,系统会提示他们输入最多3个职业选择,然后将其存储在数组中,并以其用户ID上传到firebase:
我有一个表视图控制器,目的是显示所有用户,但按其职业分开。这个想法是允许用户根据他们的特定职业来搜索其他人,以便作为参考,该应用程序上的所有设计师都可以在tableview控制器的“设计师”部分下找到。在另一种情况下,如果用户既是设计人员又是开发人员,则他们也应显示在开发人员下方。
此处的关键部分是用户手动输入其职业的事实。因此,我可以创建一个具有一组特定职业名称的数组。我必须获取所有职业的列表,然后根据职业名称过滤用户。使用从这个想法的较小版本(Smaller Version)获得的帮助,我想出了一个功能,可以按用户的职业来区分用户,但它根本无法工作:
func getOccupations() -> [IndexedOccupations] {
while !users.isEmpty {
//-- filter the users
guard let referencedUser = users.first else { return [] }
for x in (referencedUser.occupation?.count)! {
let filteredUsers = users.filter { (user) -> Bool in
for y in user.occupation.count {
return user.occupation[y] == referencedUser.occupation[x]
}
return false
}
//-- create an occupation object with an occupation name, and list of filtered users & return occupations
let indexedOccupation = IndexedOccupations(occupation: referencedUser.occupation[x]!, users: filteredUsers)
occupations.append(indexedOccupation)
}}
return occupations
}
这里两个对象如何查找参考btw:
class User: NSObject {
//-- things that a User will have stored
var id: String?
var bio: String?
var city: String?
var name: String?
var email: String?
var picture: String?
var state: String?
var links: [String]?
var playerID: String?
var occupation: [String]?
//-- initializer method
init(dictionary: [String: AnyObject]) {
self.id = dictionary["id"] as? String
self.name = dictionary["Name"] as? String
self.email = dictionary["Email"] as? String
self.city = dictionary["City"] as? String
self.state = dictionary["State"] as? String
self.picture = dictionary["Picture"] as? String
self.bio = dictionary["Bio"] as? String
self.playerID = dictionary["playerID"] as? String
self.links = dictionary["Links"] as? [String]
self.occupation = dictionary["Occupation"] as? [String]
}
}
职业:
class IndexedOccupations: NSObject {
//-- things that a user will have stored
var occupation: String?
var users: [User]
//-- initializer method
init(occupation: String, users: [User]) {
self.occupation = occupation
self.users = users
}
}
答案 0 :(得分:1)
我会像这样写字典:
var userByOccupation: [String: [User]] = []
然后创建一个函数,在其中将所有用户插入到该词典中,并以键作为他们的职业(如果他们的数量超过1,则只需添加具有相同值的新键)
因此,在“职业”之前,我不知道您的数据模型是什么样子,但是您需要做的就是对每个职业的子对象进行迭代,并为每个子对象取值并将其保存为键,将当前用户保存为值进入userByOccupation数组。
因此,首先获取当前用户,然后:
ref?.child("Occupation").observeSingleEvent(of: .value, with: { (snapshot) in
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? DataSnapshot{
if let occupation = rest.key as? String{
//And here insert OCCUPATION/USER like
if (userByOccupation[occupation] != nil) {
userByOccupation[occupation]?.append(user)
} else {
userByOccupation[occupation] = [user]
}
}
}
})
编辑评论问题:
我不知道这是否是最好的解决方案,但这是我的方法。 加载字典后,只需将所有键组成一个数组
allOccupations = Array(userByOccupation.keys)
在此之后,您可以订购该数组,例如->字典是无序的!
然后:
override func numberOfSections(in tableView: UITableView) -> Int {
return allOccupations.count
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return allOccupations[section]
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return userByOccupation[allOccupations[section]].count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Then get the user like this
guard let allUsers = userByOccupation[allOccupations[section]] else {
return }
let currentUser = allUsers[indexPath.row]
}
这个过程非常快,如果出现错误,对不起,希望对您有帮助!