สวัสดีฉันกำลังทำงานกับเลเยอร์โมเดลสำหรับแอปของเราที่นี่
ข้อกำหนดบางประการมีดังนี้:
- ควรใช้กับ iPhone OS 3.0+
- แหล่งที่มาของข้อมูลของเราคือแอปพลิเคชัน RESTful Rails
- เราควรแคชข้อมูลในเครื่องโดยใช้ Core Data
- รหัสไคลเอ็นต์ (ตัวควบคุม UI ของเรา) ควรมีความรู้เกี่ยวกับสิ่งต่างๆในเครือข่ายให้มากที่สุดเท่าที่จะเป็นไปได้และควรสอบถาม / อัปเดตโมเดลด้วย Core Data API
ฉันได้ตรวจสอบWWDC10 เซสชัน 117เกี่ยวกับการสร้างประสบการณ์ผู้ใช้ที่ขับเคลื่อนด้วยเซิร์ฟเวอร์ใช้เวลาพอสมควรในการตรวจสอบObjective Resource , Core ResourceและRestfulCoreData frameworks
เฟรมเวิร์ก Objective Resource ไม่ได้พูดคุยกับ Core Data ด้วยตัวมันเองและเป็นเพียงการนำไคลเอนต์ REST มาใช้เท่านั้น ทรัพยากรหลักและ RestfulCoreData ทั้งหมดถือว่าคุณคุยกับ Core Data ในโค้ดของคุณและพวกเขาแก้ปัญหาถั่วและสลักเกลียวทั้งหมดในพื้นหลังของเลเยอร์โมเดล
ตอนนี้ทุกอย่างดูดีและในตอนแรกฉันแม้ว่า Core Resource หรือ RestfulCoreData จะครอบคลุมข้อกำหนดข้างต้นทั้งหมด แต่ ... มีสองสิ่งที่ดูเหมือนจะไม่เกิดขึ้นเพื่อแก้ไขอย่างถูกต้อง:
- ไม่ควรบล็อกเธรดหลักขณะบันทึกการอัปเดตภายในเครื่องไปยังเซิร์ฟเวอร์
- หากการดำเนินการบันทึกล้มเหลวข้อผิดพลาดควรเผยแพร่ไปยัง UI และไม่ควรบันทึกการเปลี่ยนแปลงลงในที่เก็บข้อมูลหลักในเครื่อง
ทรัพยากรหลักเกิดขึ้นเพื่อส่งคำขอทั้งหมดไปยังเซิร์ฟเวอร์เมื่อคุณเรียก- (BOOL)save:(NSError **)error
ใช้ Managed Object Context ของคุณดังนั้นจึงสามารถจัดเตรียมอินสแตนซ์ NSError ที่ถูกต้องของคำขอพื้นฐานไปยังเซิร์ฟเวอร์ล้มเหลวได้ แต่จะบล็อกเธรดการโทรจนกว่าการดำเนินการบันทึกจะเสร็จสิ้น ล้มเหลว.
RestfulCoreData ช่วยให้การ-save:
โทรของคุณเหมือนเดิมและไม่แนะนำเวลารอเพิ่มเติมสำหรับเธรดไคลเอ็นต์ เป็นเพียงการเฝ้าดูNSManagedObjectContextDidSaveNotification
และออกคำขอที่เกี่ยวข้องไปยังเซิร์ฟเวอร์ในตัวจัดการการแจ้งเตือนเท่านั้น แต่ด้วยวิธีนี้การ-save:
โทรจะเสร็จสมบูรณ์เสมอ (โดยที่ Core Data นั้นโอเคกับการเปลี่ยนแปลงที่บันทึกไว้) และรหัสไคลเอนต์ที่เรียกว่าจริงไม่มีทางรู้ได้ว่าการบันทึกอาจล้มเหลวในการเผยแพร่ไปยังเซิร์ฟเวอร์เนื่องจากบางส่วน404
หรือ421
หรืออะไรก็ตาม เกิดข้อผิดพลาดฝั่งเซิร์ฟเวอร์ และยิ่งไปกว่านั้นที่จัดเก็บข้อมูลในเครื่องจะมีการอัปเดตข้อมูล แต่เซิร์ฟเวอร์ไม่เคยรู้เกี่ยวกับการเปลี่ยนแปลง ล้มเหลว.
ดังนั้นฉันกำลังมองหาทางออกที่เป็นไปได้ / แนวทางปฏิบัติทั่วไปในการจัดการกับปัญหาเหล่านี้:
- ฉันไม่ต้องการให้เธรดการโทรถูกบล็อกในการ
-save:
โทรแต่ละครั้งขณะที่มีการร้องขอเครือข่ายเกิดขึ้น - ฉันต้องการรับการแจ้งเตือนใน UI ว่าการซิงค์บางอย่างผิดพลาด
- ฉันต้องการให้การบันทึกข้อมูลหลักจริงล้มเหลวเช่นกันหากการร้องขอเซิร์ฟเวอร์ล้มเหลว
ความคิดใด ๆ ?