ไฟล์ซิงค์เริ่มต้นของขอบเขต

เรียนรู้วิธีใช้ Realm Mobile Platform

ฉันสร้างแอป iOS ขนาดเล็กที่สามารถบันทึกข้อมูลลงในเซิร์ฟเวอร์ได้สำเร็จ และข้อมูลมีความสอดคล้องกันในอุปกรณ์ต่างๆ แอปนี้คล้ายกับบทช่วยสอนเกี่ยวกับขอบเขตอย่างเป็นทางการ มาก

ฉันสามารถเปิด Sync URL จาก แอปพลิเคชัน Realm Browser Mac และฉันเห็นการเปลี่ยนแปลงที่เกิดขึ้นในแบบเรียลไทม์ นี่คือสิ่งที่ฉันติดอยู่: ฉันพยายามดูการเปลี่ยนแปลงในไฟล์ขอบเขตในเครื่อง แต่

print(self.realm.configuration.fileURL) ส่งคืนศูนย์ print(Realm.Configuration.defaultConfiguration.fileURL) เป็นไฟล์ว่าง

นี่คือรหัสของฉัน:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
    guard let user = user else {
        fatalError(String(describing: error))
    }

    DispatchQueue.main.async {
        // Open Realm
        let configuration = Realm.Configuration(
            syncConfiguration: SyncConfiguration(
                user: user,
                realmURL: URL(string: "realm://myIPaddress/~/realmtasks")!)
            )

        self.realm = try! Realm(configuration: configuration)

        // Show initial tasks
        func updateList() {
            self.items = Array(self.realm.objects(Row.self))
            self.tableView.reloadData()
        }

        updateList()

        print(self.realm.configuration.fileURL) 
        //returns nil

        print(Realm.Configuration.defaultConfiguration.fileURL) 
        // I can open the file, but it's empty

        // Notify us when Realm changes
        self.notificationToken = self.realm.addNotificationBlock { _ in
            updateList()
        }
}

เหตุผลที่ฉันทดสอบสิ่งนี้ก็เพื่อให้ฉันสามารถโหลดข้อมูลจากไฟล์แทนที่จะโหลดจากเซิร์ฟเวอร์ เพื่อที่: (a) การเข้าสู่ระบบจะถูกเรียกเพียงครั้งเดียวเท่านั้น (b) ข้อมูลพร้อมใช้งานเมื่อผู้ใช้ออฟไลน์


person j_theislander    schedule 21.02.2017    source แหล่งที่มา
comment
โปรดให้รายละเอียดเกี่ยวกับอุบัติเหตุครั้งนี้ได้ไหม เช่น จะสืบพันธุ์ได้อย่างไร ฯลฯ? แน่นอนว่าการซิงค์ไม่สามารถเกิดขึ้นเมื่ออุปกรณ์ออฟไลน์ แต่คุณยังคงสามารถเข้าถึงข้อมูลที่ซิงโครไนซ์ ก่อน ออฟไลน์ แอปจะต้องออนไลน์เมื่อทำการตรวจสอบสิทธิ์ผู้ใช้ครั้งแรก   -  person teotwaki    schedule 27.02.2017
comment
@teotwaki ดูเหมือนว่าฉันจะตอบคำถามของฉันไม่ถูกต้อง ขอโทษสำหรับสิ่งนั้น. หากต้องการเรียบเรียงใหม่: ฉันรู้สึกว่าการใช้ ROS จะสร้างไฟล์ขอบเขตบนดิสก์ที่ทำมิเรอร์ หลังจากทำการทดลองเพิ่มเติม ฉันได้สร้างไฟล์ Realm ที่จะอยู่บนอุปกรณ์ จากนั้นจึงส่งการเปลี่ยนแปลงไปยังไฟล์ Realm อื่นบนเซิร์ฟเวอร์ทุกครั้งที่มีการเปลี่ยนแปลงเกิดขึ้น ขอบเขตบนเซิร์ฟเวอร์มีไว้เพื่อการสำรองข้อมูล ในขณะที่ไฟล์บนดิสก์เป็นไฟล์ออฟไลน์หลัก ฉันไม่แน่ใจว่านี่เป็นแนวปฏิบัติที่ดีหรือไม่ดี แต่ฉันจะโพสต์การทดลองของฉันเมื่อเสร็จแล้วเพื่อรับคำติชม ขอบคุณมากสำหรับการตอบกลับของคุณ   -  person j_theislander    schedule 27.02.2017
comment
ไม่มีแนวคิดเกี่ยวกับอาณาจักรบนเซิร์ฟเวอร์ คุณจะทำงานกับไฟล์ในเครื่องเสมอ แม้ว่าจะเป็นการสืบค้น/แก้ไขก็ตาม หากไฟล์เปิดใช้งานการซิงค์ ประวัติของไฟล์จะถูกจำลองบนเซิร์ฟเวอร์ ซึ่งช่วยให้ไคลเอ็นต์อื่นๆ สามารถดาวน์โหลดประวัติและประกอบ Realm อีกครั้งในเครื่องได้ โดยพื้นฐานแล้วคุณกำลังทำสิ่งเดียวกันกับที่ ROS จัดเตรียมไว้ให้ด้วยตนเอง   -  person teotwaki    schedule 27.02.2017
comment
ตกลง! กำลังยกเลิกการทดลองของฉัน ???? พรุ่งนี้จะทดสอบอีกครั้ง ไฟล์เปิดใช้งานการซิงค์ตามค่าเริ่มต้นหรือไม่   -  person j_theislander    schedule 27.02.2017
comment
คือถ้าคุณเปิดอาณาจักรด้วย syncURL   -  person teotwaki    schedule 27.02.2017
comment
default.realm ยังคงว่างเปล่า ฉันเรียบเรียงคำถามเดิมของฉันใหม่ด้วยวิธีที่สมเหตุสมผลมากขึ้น - ฉันคิดว่า   -  person j_theislander    schedule 28.02.2017


คำตอบ (1)


เมื่อคุณเข้าสู่ระบบเป็นครั้งแรก Realm จะจัดเก็บผู้ใช้ไว้ในพวงกุญแจโดยอัตโนมัติ จากนั้นคุณสามารถดึงข้อมูลได้ผ่านทางคุณสมบัติ SyncUser.currentUser และใช้เพื่อเปิดอาณาจักรของคุณแม้ว่าคุณจะออฟไลน์อยู่ก็ตาม อย่างไรก็ตาม หากคุณออกจากระบบผู้ใช้ คุณจะไม่สามารถใช้งานแบบออฟไลน์ได้

realm.configuration.fileURL ไม่สามารถใช้งานได้เมื่อใช้ syncConfiguration


สำหรับกรณีนี้:

  1. โทร SyncUser.logIn เพียงครั้งเดียว
  2. สำหรับการรันแอปปกติ (เช่น การรันทั้งหมด ยกเว้นการรันครั้งแรก) หรือเขียนขอบเขตด้วยการกำหนดค่าเดียวกัน

คุณควรจะมีสิ่งนี้:

// First launch
if launchedBefore == false {
    setupRealm()

// All other launches
} else if launchedBefore == true {
    let user = SyncUser.current!
    openRealm(forUser: user)
}

โดยพื้นฐานแล้ว openRealm(forUser: SyncUser) จะเหมือนกับบล็อกการจัดส่งทั้งหมดจากโค้ดก่อนหน้า

setupRealm()สามารถเรียกมันได้เช่นกันเพื่อล้างโค้ด:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
    guard let user = user else {
        fatalError(String(describing: error))
    }

    self.openRealm(forUser: user)
}
person Dmitry    schedule 28.02.2017
comment
ขออภัย ไม่ค่อยได้ติดตามครับ ขณะนี้ default.realm ว่างเปล่า มันจะถูกเติมโดยอัตโนมัติ หลังจาก ฉันใช้ SyncUser.currentUser หรือไม่ และวิธีการเปิดที่เหมาะสมในกรณีนี้คืออะไร? - person j_theislander; 28.02.2017
comment
@Jalal คุณกำลังระบุ URI สำหรับอาณาจักรที่คุณกำลังเปิด ดังนั้นชื่อไฟล์จะแตกต่างจาก default.realm default.realm จะใช้เฉพาะเมื่อคุณใช้ตัวสร้างเริ่มต้น (เช่น: let realm = Realm()) โปรดทราบว่าเมื่อเปิด Realm ที่ซิงค์ ตำแหน่งของไฟล์ในเครื่องจะถูกซ่อนจากคุณ คุณไม่ควรพยายามเข้าถึงด้วยตนเอง - person teotwaki; 28.02.2017
comment
@teotwaki ว้าว ขอบคุณนะ! ความคิดเห็นของคุณช่วยให้ฉันเห็นว่าวิธีการทดสอบของฉันผิดอย่างไร - person j_theislander; 01.03.2017