2017-12-09 18 views
1

私はクラッシュを経験しており、ディスパッチグループ内のネストされたディスパッチグループの状況をどう処理するかについてはあまりよく分かりません。ネストされたネットワーク要求の配列を処理するための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(...)のカウンタのことは、友人の友だちリストを繰り返した後に、外部ディスパッチグループから退出しようと試みているハックです。外部の相互の友人のディスパッチグループは、クラッシュするものです。

答えて

0

問題を解決するための適切な長期的な解決策を見つけることができなかったので、私はそれをハックし、新しいユーザーをつかんでから、collectionViewを再ロードするたびに、ただし、これによりコードに問題が発生する可能性があります。

関連する問題