Này, tôi đang làm việc trên lớp mô hình cho ứng dụng của chúng tôi ở đây.
Một số yêu cầu như sau:
- Nó sẽ hoạt động trên iPhone OS 3.0+.
- Nguồn dữ liệu của chúng tôi là một ứng dụng RESTful Rails.
- Chúng ta nên lưu dữ liệu cục bộ bằng cách sử dụng Core Data.
- Mã máy khách (bộ điều khiển giao diện người dùng của chúng tôi) phải có ít kiến thức về bất kỳ nội dung mạng nào nhất có thể và nên truy vấn / cập nhật mô hình bằng API dữ liệu cốt lõi.
Tôi đã xem WWDC10 Session 117 về Xây dựng trải nghiệm người dùng hướng máy chủ, đã dành một chút thời gian để kiểm tra Tài nguyên mục tiêu , Tài nguyên cốt lõi và Dữ liệu RestfulCoreData .
Khung tài nguyên mục tiêu không tự nói chuyện với Dữ liệu cốt lõi và chỉ đơn thuần là triển khai máy khách REST. Core Resource và RestfulCoreData đều giả định rằng bạn nói chuyện với Core Data trong mã của bạn và chúng giải quyết tất cả các lỗi và bu lông trong nền trên lớp mô hình.
Tất cả đều có vẻ ổn cho đến nay và ban đầu tôi mặc dù Core Resource hoặc RestfulCoreData sẽ bao gồm tất cả các yêu cầu trên, nhưng ... Có một vài điều dường như không có gì xảy ra để giải quyết chính xác:
- Chuỗi chính sẽ không bị chặn trong khi lưu các bản cập nhật cục bộ vào máy chủ.
- Nếu thao tác lưu không thành công, lỗi sẽ được truyền tới giao diện người dùng và không có thay đổi nào được lưu vào bộ lưu trữ Dữ liệu lõi cục bộ.
Core Resource xảy ra để đưa ra tất cả các yêu cầu của nó tới máy chủ khi bạn gọi - (BOOL)save:(NSError **)error
trên Ngữ cảnh đối tượng được quản lý của mình và do đó có thể cung cấp phiên bản NSError chính xác của các yêu cầu cơ bản đến máy chủ bị lỗi bằng cách nào đó. Nhưng nó chặn luồng gọi cho đến khi hoạt động lưu kết thúc. THẤT BẠI.
RestfulCoreData giữ -save:
nguyên các cuộc gọi của bạn và không giới thiệu thêm bất kỳ thời gian chờ đợi nào cho chuỗi ứng dụng khách. Nó chỉ đơn thuần theo dõi NSManagedObjectContextDidSaveNotification
và sau đó đưa ra các yêu cầu tương ứng đến máy chủ trong trình xử lý thông báo. Nhưng cách này -save:
gọi luôn hoàn thành công (tốt, đưa dữ liệu cốt lõi là ổn với những thay đổi lưu) và mã khách hàng mà thực sự gọi là nó không có cách nào để biết sự tiết kiệm có thể đã thất bại trong việc tuyên truyền đến máy chủ vì một số 404
hoặc 421
hoặc bất cứ điều gì đã xảy ra lỗi phía máy chủ. Và thậm chí nhiều hơn nữa, bộ lưu trữ cục bộ sẽ được cập nhật dữ liệu, nhưng máy chủ không bao giờ biết về những thay đổi. THẤT BẠI.
Vì vậy, tôi đang tìm kiếm một giải pháp khả thi / các phương pháp phổ biến để giải quyết tất cả những vấn đề sau:
- Tôi không muốn chuỗi cuộc gọi bị chặn trên mỗi
-save:
cuộc gọi trong khi các yêu cầu mạng xảy ra. - Tôi muốn bằng cách nào đó nhận được thông báo trong giao diện người dùng rằng một số hoạt động đồng bộ hóa đã bị lỗi.
- Tôi muốn lưu Dữ liệu lõi thực tế cũng không thành công nếu các yêu cầu máy chủ không thành công.
Có ý kiến gì không?