let group = DispatchGroup()
group.enter()
DispatchQeue.global().async {
for i in 1...5 {
print("\(i)⭐️")
}
group.leave()
}
group.enter()
DispatchQeue.global().async {
for i in 100...105 {
print("\(i)🔥")
}
group.leave()
}
DispatchQueue.notify(queue: group) {
print("task end")
}
let group = DispatchGroup()
DispatchQueue.global().async(group: group1) {
//task
}
//다른 큐로 보내지만 같은 그룹으로 지정
DispatchQueue.global(qos: .utility).async(group: group1) {
//task
}
DispatchQueue.global().async(group: group1) {
//task
}
//main queue 에서 notification block 을 실행한다
group1.notify(queue: .main) { [weak self] in
self?.myLabel.text = "Group1으로 묶인 모든 작업이 끝났습니다."
}
firebase에서 Reference 배열로 처리한 문서 가져오기
//DataType 정의
struct DemoReview: Codable {
var menuId : String?
var menuName : String?
var reviewContent: String?
var reviewId : String?
var userId : String?
var userNickname : String?
enum CodingKeys: String, CodingKey {
case menuId = "menu_id"
case menuName = "menu_name"
case reviewContent = "review_content"
case reviewId = "review_id"
case userId = "user_id"
case userNickname = "user_nickname"
}
}
struct User: Codable {
var myReviews : [DocumentReference] = []
enum CodingKeys: String, CodingKey {
case myReviews = "my_reviews"
}
}
//MARK: - firebase 데이터 땡기기 관련
extension User {
func fetchMyReviews(completion : @escaping ([DemoReview]?) -> Void) {
// 병렬로 처리
let group = DispatchGroup()
var fetchedDemoReviews : [DemoReview] = []
self.myReviews.forEach { ref in
group.enter()
//reference로 처리된 문서의 내용 가져오기
ref.getDocument { snapShot, err in
if err != nil {
group.leave()
return
}
guard let snapShot = snapShot else {
group.leave()
return
}
print(#fileID, #function, #line, "- demoReview checking⭐️: \(snapShot.data())")
if let fetchedDemoReviewItem = try? snapShot.data(as: DemoReview.self) {
fetchedDemoReviews.append(fetchedDemoReviewItem)
}
group.leave()
}
}
//작업이 완료됨(즉, reference로 처리된 문서를 다 가져옴)
group.notify(queue: .main){
print(#fileID, #function, #line, "- 완료")
completion(fetchedDemoReviews) /fetchMyReviews()의 completion실행
}
}
}
//User정보를 가지고 오는 firebase함수 작성
final class FirebaseManager {
//싱글톤으로 만들기
static let shared = FirebaseManager()
let userDbRef = Firestore.firestore().collection("User")
//User정보를 가져오는 함수
func fetchCurrentUser(userId: String, completion: @escaping (User?) -> Void) {
//firebase에서 정보 요청
userDbRef.document(userId).getDocument { snapShot, err in
if err != nil {
completion(nil)
return
}
guard let snapShot = snapShot else {
completion(nil)
return
}
print(#fileID, #function, #line, "- user snapshot data check⭐️: \(snapShot.data())")
let fetchedUser = try? snapShot.data(as: User.self)
//User정보를 가져와서 파싱하고 completion을 터트림
completion(fetchedUser)
}
}
}
//fetchCurrentUser함수 실행
FirebaseManager.shared.fetchCurrentUser(userId: "rayoung1", completion: { user in
//user에 관한 정보를 다 가져왔을 때
if let user = user {
//user type에 정의된 fetchMyReviews호출
user.fetchMyReviews(completion: { myReviews in
print(#fileID, #function, #line, "- myReviews: \(myReviews)")
})
}
})