ปัญหาเกี่ยวกับการทำงานของฟังก์ชันตามการอ้างอิงที่เก็บข้อมูล Firebase ใน Swift

ฉันใช้รหัสต่อไปนี้เพื่ออัปเดตรูปโปรไฟล์ใน Firebase:

    func saveProfileImage(_ userUID: String, _ completion: @escaping (Error?) -> Void) {
    let resizedImage = image.resized()
    let imageData = UIImageJPEGRepresentation(resizedImage, 1.0)

    ref = StorageReference.profileImages.reference().child(userUID)
    downloadLink = ref.description

    ref.put(imageData!, metadata: nil) {
        (metaData, error) in
        completion(error)
    }
    updateProfilePic(userUID)
}

updateProfilePic เป็นฟังก์ชันที่สร้างขึ้นเพื่อทริกเกอร์ childChanged เพื่อให้ผู้ใช้ดาวน์โหลดรูปโปรไฟล์ใหม่ มันใช้งานไม่ได้และฉันคิดว่าเป็นเพราะมันถูกเรียกก่อนที่ StorageReference จะอัปเดตเสร็จ มีวิธีใดที่จะแน่ใจได้ว่าฟังก์ชันนี้จะถูกเรียกใช้หลังจากการอ้างอิงเสร็จสิ้นแล้วเท่านั้น


person Sudacris    schedule 11.07.2017    source แหล่งที่มา


คำตอบ (2)


สำหรับโค้ดที่คุณต้องเรียกเมื่อบล็อกที่สมบูรณ์ทำงานเท่านั้น คุณควรวางโค้ดดังกล่าวไว้ในบล็อกที่สมบูรณ์ ดังนั้นให้เปลี่ยน:

ref.put(imageData!, metadata: nil) {
        (metaData, error) in
        completion(error)
    }
    updateProfilePic(userUID)

to

    ref.put(imageData!, metadata: nil) {
        (metaData, error) in

        guard error == nil else {
           print("Error from adding to FIRDatabase: \(error)")
           return
        }

        self.updateProfilePic(userUID)
    }

ถ้า updateProfilePic ต้องถูกเรียกเสมอหลังจากบล็อคเสร็จสมบูรณ์สำเร็จ

person jlmurph    schedule 11.07.2017
comment
ดูเหมือนว่าคำถามจะได้รับคำตอบแล้ว หวังว่าจะช่วยแก้ไขปัญหาในวงกว้างได้เช่นกัน - person Sudacris; 11.07.2017
comment
ตอบเร็วจริง! ฮ่าๆ - person jlmurph; 11.07.2017
comment
ตอนนี้มันใช้งานได้แล้ว ขอบคุณ มันเป็นปัญหาแปลก ๆ ที่ฉันสืบย้อนกลับไปถึงสาเหตุนี้ - person Sudacris; 11.07.2017

เพื่อให้แน่ใจว่า updateProfilePic() ถูกเรียกหลังจากการอัปโหลดเสร็จสิ้น ให้ย้าย ไปยัง ตัวจัดการการเรียกกลับ/การเสร็จสิ้น:

func saveProfileImage(_ userUID: String, _ completion: @escaping (Error?) -> Void) {
    let resizedImage = image.resized()
    let imageData = UIImageJPEGRepresentation(resizedImage, 1.0)

    ref = StorageReference.profileImages.reference().child(userUID)
    downloadLink = ref.description

    ref.put(imageData!, metadata: nil) {
        (metaData, error) in
        completion(error)
        updateProfilePic(userUID)
    }
}
person Frank van Puffelen    schedule 11.07.2017