私のアプリは約500人のユーザーを持っています。あるスクリーンでは、教師が選択する学生のユーザーを読み込んでいます。生徒のリスト(400)は、20秒以上かけて移住しています。私は、データをより効率的に埋め込む方法があるのだろうかと思います。作成するデータは、uid、最初、最後、電子メールです。ユーザーデータのSwift Firebaseロングロード時間
生徒のユーザーを取得する機能は次のとおりです。
var filteredUsers = [User]()
var users = [User]()
fileprivate func fetchFollowingUserIds() {
let ref = Database.database().reference().child("session1AllStudents")
ref.observeSingleEvent(of: .value, with: { (snapshot) in
guard let userIdsDictionary = snapshot.value as? [String: Any] else { return }
print(userIdsDictionary)
userIdsDictionary.forEach({ (key, value) in
HUD.show(.labeledProgress(title: "Finding Students", subtitle: nil))
Database.fetchStudentUsersWithUID(uid: key, completion: { (user) in
self.users.append(user)
print(self.users)
self.users.sort(by: { (u1, u2) -> Bool in
return u1.lastName.compare(u2.lastName) == .orderedAscending
})
self.filteredUsers = self.users
print(self.filteredUsers.count)
self.collectionView?.reloadData()
HUD.hide()
})
})
}) { (err) in
print("Failed to fetch following userids:", err)
}
}
extension Database {
static func fetchStudentUsersWithUID(uid: String, completion: @escaping (User) ->()) {
Database.database().reference().child("studentUsers").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
guard let userDictionary = snapshot.value as? [String: Any] else { return }
let user = User(uid: uid, dictionary: userDictionary)
completion(user)
}) { (err) in
print("Failed to fetch user for posts:", err)
}
}
}
データベース「session1AllStudents」すべての生徒のリストは、まだ選択してみましょうとUID持っている:真のキー:値のペアを。
次に、「studentUsers」の学生情報がリストのUIDから取得されています。
--UPDATED--
私はコメントを見た後、次を使用していました。
func fetchRemainingStudents() {
let ref = Database.database().reference()
ref.child("session1AllStudents").observeSingleEvent(of: .value, with: { (snapshot) in
HUD.show(.labeledProgress(title: "Finding Students", subtitle: nil))
for snap in snapshot.children {
let studentsSnap = snap as! DataSnapshot
let studentsKey = studentsSnap.key
let studentDict = snapshot.value as! [String: Any]
var aStudent = User(uid: studentsKey, dictionary: studentDict)
let userRef = ref.child("studentUsers").child(studentsKey)
userRef.observeSingleEvent(of: .value, with: { snapshot in
let userDict = snapshot.value as! [String:AnyObject]
let firstName = userDict["firstName"] as! String
let lastName = userDict["lastName"] as! String
let email = userDict["email"] as! String
aStudent.firstName = firstName
aStudent.lastName = lastName
aStudent.email = email
self.users.append(aStudent)
self.filteredUsers = self.users
print(self.filteredUsers.count)
self.users.sort(by: { (u1, u2) -> Bool in
return u1.lastName.compare(u2.lastName) == .orderedAscending
})
HUD.hide()
self.collectionView?.reloadData()
})
}
})
}
これは、データの読み込みを高速化するのに役立ちました。たぶん1〜2秒です。
1秒未満で何千ものノードをロードできるはずです。問題の一部である可能性のある問題のコードには、いくつかの問題があります。並べ替え、並べ替え、配列を再読み込みするたびにループを介してtableViewを読み込みます。 – Jay
@Jay私はこれをより効率的にすることができるいくつかの場所で私を助けてくれますか? –
答えを確認したのかどうかわかりませんが、パフォーマンスを向上させるために少し更新しました。 – Jay