ObserveSingleEvent ส่งคืนข้อมูลเก่า

ฉันต้องการดึงหมายเลขเวอร์ชันของแอปที่ต้องการเมื่อแอปเริ่มทำงาน แต่ฉันไม่สามารถรับกุญแจที่ถูกต้องได้

ฉันมีรหัสนี้เพื่อดึงข้อมูล ฉันใช้การสังเกตเหตุการณ์เดียวเพราะฉันใช้วิธีนี้เพื่อตรวจสอบหมายเลขเวอร์ชันแอปที่ต้องการ วิธีนี้จะเกิดขึ้นเมื่อแอปเริ่มทำการตรวจสอบเท่านั้น

func getVersion(completionHandler: @escaping (Result<Any?>) -> ()) {

     let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS")

     ref?.observeSingleEvent(of: .value , with: { snapshot in

         if snapshot.exists() {    
            let recent = snapshot.value as!  NSDictionary  
            print(recent)
         }
     })
}

แต่มันกลับผลลัพธ์เก่าเหรอ? ฉันเปิดใช้งาน isPersistenceEnabled ที่ Appdelegate ของฉันแล้ว

นี่คือโครงสร้างฐานข้อมูล:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่ได้รับผลลัพธ์เมื่อฉันใช้ Database.database().reference().child("version").child("IOS"). snapshot.exists is false เมื่อฉันใช้สิ่งนั้น

สิ่งที่ฉันเคยมีคือ: - version | ไอโอเอส - 1.0

และฉันจะได้ผลลัพธ์เมื่อฉันใช้ Database.database().reference().child("version"), namely {iOS => 1.0} ฉันไม่เข้าใจเพราะมันเป็นโครงสร้างเก่าของฉัน


person da1lbi3    schedule 28.07.2017    source แหล่งที่มา
comment
เมื่อตั้งค่า isPersistenceEnabled เป็นจริง ผู้สังเกตการณ์จะดึงข้อมูลจากที่จัดเก็บในเครื่องก่อน เนื่องจาก observeSingleEventOfType มีไว้เพื่อสังเกตเพียงครั้งเดียว จึงดึงข้อมูลจากที่จัดเก็บในตัวเครื่องเท่านั้น   -  person Muhammad Hassan    schedule 28.07.2017
comment
@MuhammadHassan มีวิธีบังคับให้โหลดข้อมูลซ้ำหรือไม่?   -  person da1lbi3    schedule 28.07.2017


คำตอบ (2)


ฐานข้อมูลเรียลไทม์ Firebase ซิงโครไนซ์และจัดเก็บสำเนาข้อมูลในเครื่องสำหรับผู้ฟังที่ใช้งานอยู่ นอกจากนี้ คุณยังสามารถซิงค์สถานที่เฉพาะได้

let scoresRef = Database.database().reference(withPath: "scores")
scoresRef.keepSynced(true)

ไคลเอนต์ Firebase Realtime Database จะดาวน์โหลดข้อมูลในตำแหน่งเหล่านี้โดยอัตโนมัติ และซิงค์ข้อมูลไว้แม้ว่าข้อมูลอ้างอิงจะไม่มี Listener ที่ใช้งานอยู่ก็ตาม คุณสามารถปิดการซิงโครไนซ์กลับได้ด้วยโค้ดบรรทัดต่อไปนี้

scoresRef.keepSynced(false)

ยังไม่ได้ลองจริงๆ แต่น่าจะได้ผล

person Muhammad Hassan    schedule 28.07.2017
comment
นั่นหมายความว่าคุณมีการเชื่อมต่อกับ Firebase อย่างต่อเนื่องในขณะที่เป็นจริงใช่ไหม แค่สงสัยเพราะคุณอนุญาตการเชื่อมต่อพร้อมกันเพียง 100 ครั้งในระดับฟรี @มูฮัมหมัด ฮัสซัน - person Jan-Dawid Roodt; 13.11.2018
comment
ยังไม่ได้อ่านเอกสาร Firebase เมื่อเร็ว ๆ นี้ แต่ฐานผู้ใช้ในระดับฟรีข้าม 500 ในแอปใดแอปหนึ่ง (ฉันได้ทำงานแล้ว) โดยไม่มีข้อร้องเรียน - person Muhammad Hassan; 13.11.2018
comment
โอ้ ว้าว คุณแน่ใจหรือว่าพวกเขาเชื่อมต่อพร้อมกัน? หากคุณไปที่ firebase -› ฐานข้อมูล - › การใช้งานมันบอกว่ามี 500 ที่นั่นหรือคุณหมายถึงผู้ใช้? (ยังไงก็ยินดีด้วย! ฮ่าๆ) - person Jan-Dawid Roodt; 14.11.2018

เมธอด observeSingleEvent ใช้สำหรับข้อมูลที่ไม่มีการเปลี่ยนแปลงจริงๆ และด้วยเหตุนี้ มันจะดึงข้อมูลจากแคชในเครื่องหากคุณเปิดใช้งานการคงอยู่

โซลูชัน Android นี้ (https://stackoverflow.com/a/40477280/883413) ให้วิธีแก้ปัญหาโดยใช้วิธีอื่น , runTransactonBlock.

ธุรกรรมให้โอกาสในการแก้ไขข้อมูลก่อนที่จะบันทึก ที่นี่เราสามารถยอมรับข้อมูลได้ถูกต้องเนื่องจากเราสนใจเฉพาะการอ่านค่าล่าสุดเท่านั้น

let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS")
ref.runTransactionBlock({ (data) -> TransactionResult in
    return TransactionResult.success(withValue: data)

}, andCompletionBlock: { (error, success, snapshot) in
    if let snapshot = snapshot, snapshot.exists() {
        if let recent = snapshot.value as? NSDictionary {
            print(recent)
        }
    }
})
person Ric Santos    schedule 28.08.2017