I hope you are doing fine.
I am trying to achieve following thing:
) Fetch data array from database (async call)
) Iterate over fetched data array
) Fetch additional information about each object (async call)
) Create a new data array with all the information and return it back
Code Block self.dataAccessService.fetchRepliesByCommentId(completionHandler: { (commentReplyArray) in for var i in 0..<commentReplyArray.count { let commentReply = commentReplyArray[i] let commentItem = CommentItem() self.fetchDetailsAboutCommentReply(commentReplyObject: commentReply) { (commentItem) in commentItem.commentObject = commentReply dataSource.insert(commentItem, at: index + i + 1) -> APP CRASHES HERE, i is never 0 here ips.append(IndexPath(row: index + i + 1 , section: 0)) if (i == commentReplyArray.count - 1) { self.delegate?.didLoadReplies(dataSource: dataSource, ips: ips) } } } }, commentId: commentItem.commentObject.id)
My fetchDetailsAboutCommentReply function:
Code Block private func fetchDetailsAboutCommentReply(commentReplyObject:CommentReply, completionHandler:@escaping(CommentItem)->()) { let group = DispatchGroup() let commentItem = CommentItem() group.enter() self.dataAccessService.fetchUserById(completionHandler: { (userObject) in commentItem.userObject = userObject group.leave() }, uid: commentReplyObject.userId) group.enter() self.dataAccessService.fetchDownloadURLOfProfileImage(organizerId: commentReplyObject.userId) { (contentURL) in commentItem.userObject.contentURL = contentURL group.leave() } group.notify(queue: .main) { completionHandler(commentItem) } }
My question is how, I can change my code, so the loop basically "pauses" until I fetch every detail information of the iterated object, add it into the dataSource Array and then continues with the next one?
Thanks and stay healthy!