私はクラッシュを経験しており、ディスパッチグループ内のネストされたディスパッチグループの状況をどう処理するかについてはあまりよく分かりません。ネストされたネットワーク要求の配列を処理するためのIOS SwiftネストされたDispatchGroup
私はIOS SwiftとFirebaseを使用しています。基本的に友人リストを取得してから関連性の高い友人を取得しています。友人リストの友人の友人(私の友人のように)、もし私が先にそれらをつかんでいなければ(私はすでに友達を奪ったIveのリストを使用しています)、私はfbに現在のユーザーと相互の友人との間の相互の友人の数と、それらが十分に関連して追加されているかどうかを確認します。
しかし、私は、火災基地から学校の友人を奪った後に別の要求があります。また、相互の友人である学校の友人がいるので、重複した項目がないことを確認する必要があります。私はそうのようなディスパッチグループを使用しています:
// Iterates through friendList to grab mutual friends
for user in currUser.friendList {
// Grabs user friend list
let userFriendListRef = Database.database().reference().child("friend-list").child(user.userID)
userFriendListRef.observeSingleEvent(of: .value, with: { (snapshot) in
guard snapshot.exists(),
let userFriendList = snapshot.value as? [String: Any] else {
logger.info("No mutual friends grabbed from friend")
return
}
// Mutual friends dispatchGroup
self.mutualFriendsDispatchGroup.enter()
// If exists friends, then see if matches user's interest
self.filterMutualFriendsToMatchUserInterest(using: userFriendList)
})
}
self.mutualFriendsDispatchGroup.notify(queue: .main) {
logger.info("Done mutual friends")
}
// Checks if mutual friend matches interest and then adds it into collectionView
fileprivate func filterMutualFriends(using userFriendList: [String: Any]) {
// Maintains a counter
var searchedMutualFriendCounter = 0
// Iterates through userFriendList
for (userID, _) in userFriendList {
searchedMutualFriendCounter += 1 // Increments counter
// Ensures not repeating a mutual friend
guard usersAddedToHomeScroll[userID] == nil,
searchedUsers[userID] == nil,
!blockedUsers.contains(userID) else {
// Handles mutual friend dispatch group leave condition
if searchedMutualFriendCounter == userFriendList.count {
self.mutualFriendsDispatchGroup.leave()
return
}
continue
}
searchedUsers[userID] = true
grabFriendsDispatchGroup.enter()
// Checks if has enough mutual friends, if yes, grab mutual friend data, else skip
checkIfFriendHasEnoughMutualFriends(userID) { (result) -> Void in
// Makes sure that has enough mutual friends
guard result else {
logger.info("Not enough mutual friends to show in userFriendScroll for \(userID)")
self.grabFriendsDispatchGroup.leave()
// Handles mutual friend dispatch group leave condition
if searchedMutualFriendCounter == userFriendList.count {
self.mutualFriendsDispatchGroup.leave()
}
return
}
logger.info("Mutual friend ID grabbed for \(userID)")
self.grabMutualFriendData(userID, index: searchedMutualFriendCounter, total: userFriendList.count)
}
}
}
fileprivate func getAllFriends() {
// Grabs mutual friends
getMutualFriends()
// Gets school friends
getSchoolFriends()
// Reloads data after grabbing it all
grabFriendsDispatchGroup.notify(queue: .main) {
self.collectionView.reloadData()
}
}
私もgrabMutualFriendData(...)メソッドでmutualFriendsDispatchGroup.leave()を呼び出します。
私は大量のコードをお詫びします。私は基本的にどのように相互の友人をつかむためのネットワーク要求にネストし、私のコレクションのエントリは、グラブされたユーザを表示します。
注:filterMutualFriends(...)のカウンタのことは、友人の友だちリストを繰り返した後に、外部ディスパッチグループから退出しようと試みているハックです。外部の相互の友人のディスパッチグループは、クラッシュするものです。