2010-06-06 40 views
7

Tôi đang làm việc trên một ứng dụng iPhone thông thường để lấy dữ liệu từ máy chủ (XML, JSON, v.v ...) và tôi tự hỏi cách tốt nhất để triển khai dữ liệu đồng bộ hóa là gì . Tiêu chí là tốc độ (ít trao đổi dữ liệu mạng), mạnh mẽ (khôi phục dữ liệu trong trường hợp cập nhật thất bại), truy cập ngoại tuyến và tính linh hoạt (có thể thích ứng khi cấu trúc của cơ sở dữ liệu thay đổi một chút, như cột mới). Tôi biết nó thay đổi từ ứng dụng đến ứng dụng, nhưng các bạn có thể chia sẻ một số chiến lược/kinh nghiệm của bạn không?Chiến lược tốt nhất để đồng bộ hóa dữ liệu trong ứng dụng iPhone

Đối với tôi, tôi đang nghĩ đến một cái gì đó như thế này:

1) cửa hàng cuối Date Modified trong iPhone

2) Khi tung ra, gửi một thông báo như getNewData.php lastModifiedDate = ...?

3) Máy chủ sẽ xử lý và gửi lại chỉ dữ liệu đã sửa đổi từ lần trước.

4) Những thông tin này được định dạng như vậy:

<+><data id="..."></data></+> // add this to SQLite/CoreData

<-><data id="..."></data></-> // remove this

<%><data id="..."><attribute>newValue</attribute></data></%> // new modified value

Tôi không muốn làm cho < +>, < ->, <%> ... cho mỗi thuộc tính là tốt, bởi vì nó sẽ quá phức tạp, vì vậy có lẽ khi nhận được một trường <%>, tôi sẽ chỉ xóa dữ liệu với id được chỉ định và sau đó thêm lại nó (giả sử id ở đây không phải là một số trường tự động tăng dần).

5) Sau khi mọi thứ được tải xuống và cập nhật, tôi sẽ cập nhật trường Ngày sửa đổi lần cuối.

Vấn đề chính với chiến lược này là: Nếu mạng bị hỏng khi tôi cập nhật nội dung nào đó => Ngày sửa đổi cuối cùng chưa được cập nhật => lần tiếp theo tôi khởi chạy lại ứng dụng, tôi sẽ phải trải qua cùng một điều lần nữa. Chưa kể đến dữ liệu không phù hợp tiềm năng. Nếu tôi sử dụng một bảng tạm thời để cập nhật và làm cho toàn bộ nguyên tử, nó sẽ hoạt động, nhưng sau đó một lần nữa, nếu bản cập nhật quá dài (nhiều thay đổi dữ liệu), người dùng phải chờ một thời gian dài cho đến khi có dữ liệu mới. Tôi có nên sử dụng Last-Modified-Date cho từng trường dữ liệu và cập nhật dần dữ liệu không?

Trả lời

2

Tôi sẽ bắt đầu bằng cách làm cho nguyên tắc cập nhật nguyên tử, vì bạn sẽ có đủ trên bàn tay của bạn tìm ra cách để làm cho giao tiếp client-server hoạt động đúng cách.

Sau đó là thời điểm tốt để cân nhắc tinh chỉnh nó để tăng dần, nhưng chỉ sau khi bạn thực hiện một số thử nghiệm để tìm hiểu xem nó có thực sự cần thiết hay không. Nếu bạn đang điều chỉnh giao thức cập nhật của mình thành băng thông thấp nhất có thể, bạn có thể khám phá rằng ngay cả bản cập nhật "lớn" được tải xuống đủ nhanh.

Một cách khác để xem xét đó là tự hỏi mình, tần suất xảy ra sự cố mạng khi người dùng trung bình đang thực hiện đồng bộ hóa? Bạn có thể không muốn điều chỉnh cho các tình huống không chắc chắn.

Nếu bạn đang cố gắng tối ưu hóa (giảm thiểu) việc chuyển dữ liệu bạn có thể muốn xem xét một định dạng khác với XML, vì XML khá dài dòng. Hoặc ít nhất bạn có thể muốn giao dịch trong khả năng đọc XML cho không gian bằng cách làm cho mỗi tên phần tử và thuộc tính càng nhỏ càng tốt, và loại bỏ tất cả khoảng trống không cần thiết.

0

Đề án cơ bản của bạn là tốt.Điều bạn cần làm là bằng cách nào đó làm cho bản cập nhật của bạn không cần thiết để bạn có thể khởi động lại quá trình chuyển hoàn toàn một phần mà không gặp rủi ro. Đây là một cách tốt hơn để cố gắng thực hiện một số loại cam kết nguyên tử thực sự (mặc dù bạn cũng có thể làm điều đó, bằng cách sử dụng, ví dụ, cơ sở dữ liệu SQLite).

Trong các bản cập nhật khá lớn (10s KB) có thể tải xuống khá nhanh, nếu máy chủ đủ nhanh. Không cần phải chia nhỏ các cập nhật thành các bit nhỏ. Nhưng chắc chắn nó sẽ không làm tổn thương để cố gắng giảm thiểu lượng dữ liệu được truyền bằng cách giữ thông tin chi tiết hơn về "cập nhật lần cuối".

(Và chắc chắn bạn nên sử dụng JSON thay vì XML làm đại diện dữ liệu được truyền của bạn.)

0

Tự hỏi nếu bạn đã cân nhắc sử dụng Khung đồng bộ để quản lý đồng bộ hóa. Nếu bạn quan tâm, bạn có thể xem dự án nguồn mở, dịch vụ Đồng bộ hóa của OpenMobster. Bạn có thể làm các hoạt động đồng bộ sau

  • hai chiều
  • một chiều client
  • một chiều thiết bị
  • khởi động

Bên cạnh đó, tất cả thay đổi được theo dõi tự động và đồng bộ hóa với Cloud. Bạn có thể ẩn ứng dụng của mình khi kết nối mạng bị gián đoạn. Nó sẽ theo dõi bất kỳ thay đổi nào và tự động trong nền đồng bộ hóa với đám mây khi kết nối trả về. Nó cũng cung cấp đồng bộ hóa như iCloud trên nhiều thiết bị

Ngoài ra, các sửa đổi trong Đám mây được đồng bộ hóa bằng thông báo Đẩy, vì vậy dữ liệu luôn luôn hiện hành ngay cả khi dữ liệu được lưu trữ cục bộ.

Trong trường hợp của bạn,

Criteria are speed (less network data exchange), robustness (data recovery in case update fails), offline access 
  • Speed: Chỉ có thay đổi được gửi qua mạng theo cả hai hướng

  • Mạnh mẽ: Nó lưu trữ dữ liệu trong một cửa hàng giao dịch như sqlite và bất kỳ thất bại cập nhật được truyền đạt trong tải trọng SyncML. Chỉ các hoạt động thành công được xử lý trong khi các hoạt động không được tái cố gắng trong đồng bộ tiếp theo

Dưới đây là một liên kết đến các dự án mã nguồn mở: http://openmobster.googlecode.com

Dưới đây là một liên kết đến iPhone App Sync: http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

Các vấn đề liên quan