2009-03-27 34 views
27

Tôi đang tìm cách xây dựng một ứng dụng hoạt động tốt như ngoại tuyến khi trực tuyến. Vì ứng dụng không thể giao tiếp với máy chủ trong khi ngoại tuyến, có một số mức đồng bộ hóa cần thực hiện.Ứng dụng ngoại tuyến trên iPhone với đồng bộ hóa

Một số công cụ tốt để đọc và bắt đầu suy nghĩ về khi lập kế hoạch hoạt động ngoại tuyến với đồng bộ hóa cho iPhone của bạn là gì?

Tôi sẽ tự tạo công cụ nào, so với các công cụ mà Apple đã cung cấp để trợ giúp cho vấn đề cụ thể này?

+3

Tôi thứ hai câu hỏi này, và thêm rằng tôi muốn nghe về các chiến lược cho việc sáp nhập dữ liệu không đồng bộ hóa. Liên hệ với một máy chủ để đồng bộ hóa là không có trí tuệ. Phần khó khăn là tìm ra cách kết hợp dữ liệu máy chủ với dữ liệu cục bộ. – Alex

Trả lời

14

có rất nhiều ứng dụng trên App Store mà dựa vào cả trực tuyến cũng như ẩn dữ liệu

những gì bạn thực sự cần phải làm là bắt đầu của ứng dụng của bạn, hãy chạy một sợi nền (chạy âm thầm để bạn người dùng không bao giờ thấy bất kỳ sự chậm trễ nào). chủ đề này tải xuống dữ liệu mới nhất từ ​​máy chủ của bạn và đẩy nó vào cơ sở dữ liệu cục bộ của bạn (sqlite là lựa chọn tốt nhất)

đảm bảo bạn triển khai một số loại phiên bản dữ liệu để ứng dụng của bạn chỉ tải xuống dữ liệu. - nếu không, bạn sẽ không cần tải xuống toàn bộ tập dữ liệu có thể khá lớn (tùy thuộc vào yêu cầu ứng dụng của bạn)

cũng đảm bảo kiểm tra kết nối internet khi thực hiện việc này. nếu không có internet, hãy cảnh báo người dùng cho chắc chắn

theo cách này, bạn sẽ tận dụng tối đa cả hai thế giới. người dùng khi đi từ internet vẫn có thể sử dụng ứng dụng của bạn với dữ liệu sqlite cục bộ của họ

trong iphone os 3.0 apple đã giới thiệu dịch vụ đẩy - nơi bạn có thể chỉ cần "PUSH" dữ liệu của mình thay vì thực hiện "PULL". trong hệ điều hành iPhone hiện tại (2.xx)

+0

Trong trường hợp của nhiều thiết bị, bạn kết thúc với yêu cầu sao chép tổng thể chính. Hãy chắc chắn rằng bạn tài khoản cho các xung đột. Xem xét sử dụng GUID để tránh xung đột id trên hồ sơ mới. Không tìm thấy – jchook

2

Tôi sẽ lưu trữ tất cả thông tin tôi thu thập khi ngoại tuyến trong cơ sở dữ liệu SQLite. Sau đó, theo yêu cầu của người dùng, bạn có thể SYNC tất cả các thông tin được lưu trữ với một máy chủ bằng cách sử dụng HTTP hoặc giao thức TCP/IP tùy chỉnh mà bạn có thể đưa ra.

Tôi đã sử dụng phương pháp này trên các ứng dụng Palm OS trong gần 10 năm nay và chúng hoạt động rất hiệu quả.

Theo như tôi biết, chỉ có "công cụ" bạn sẽ phải thực hiện điều này là đồng bằng cũ MỤC TIÊU-C với Cocoa Touch. Mặc dù bạn có thể sử dụng một số thư viện TCP/IP C++ để làm cho cuộc sống của bạn dễ dàng hơn nếu bạn quyết định triển khai giao thức của riêng bạn.

+0

Vui lòng không viết hoa quá mức "Mục tiêu-C". –

4

Đẩy có lẽ không phải là một lựa chọn khả thi ở đây, vì lượng dữ liệu bạn có thể đẩy là rất nhỏ và về cơ bản trở lại "báo cho ứng dụng của tôi thực hiện cuộc gọi máy chủ". Chúng tôi sử dụng mô hình trực tuyến/ngoại tuyến trong Satchel. Bất cứ khi nào chúng ta phải giao tiếp với máy chủ, chúng tôi gộp giao tiếp đó (một URL và có thể một số dữ liệu POST) và lưu nó vào cơ sở dữ liệu. Nếu chúng ta đang trực tuyến, chúng tôi kéo nó ra ngay, gửi đi và khi chúng tôi nhận được phản hồi hợp lệ, chúng tôi sẽ xóa bản ghi khỏi cơ sở dữ liệu. Nếu chúng ta ngoại tuyến, những hàng đó sẽ tích lũy và lần sau chúng ta trực tuyến, chúng sẽ được gửi đi. Đây không phải là một mô hình khả thi trong mọi tình huống, nhưng có thể được điều chỉnh cho phù hợp nhất.

Trong 3.0, bạn có quyền truy cập vào CoreData, một công cụ quản lý dữ liệu tuyệt vời. Ngoài ra, gia đình NSURLXXX là bạn của bạn.

3

http://blog.webscale.co.in/?p=159 Bài viết này liệt kê các phương pháp xử lý đồng bộ hóa dữ liệu ngoại tuyến/trực tuyến. Nó có thể giúp bạn, nếu bạn muốn tạo khung của riêng bạn.

+1

Trang –

16

Tôi đã làm việc trên một ứng dụng xử lý hành vi chính xác này trong 2 tháng qua. Nó có một tập nhỏ các chức năng chỉ trực tuyến và một tập hợp lớn các chức năng ngoại tuyến/trực tuyến.

Tôi đang sử dụng sqlite để lưu trữ cục bộ như được đề xuất ở đây với một phiên bản sửa đổi của thư viện sqlitepersistentobjects. Phiên bản cơ sở của sqlitepersistentobjects không phải là chủ đề an toàn để xem nếu bạn đang sử dụng nó. (kiểm tra objectiverecord trong: objectivesync cho một chủ đề an toàn thay thế nhưng được chuẩn bị để đào sâu vào mã). Nếu bạn sẵn sàng phát triển cho sdk 3.0 thì dữ liệu cốt lõi là một khả năng khác cho một thư viện sqlite.

Kiến trúc tổng thể đủ đơn giản Tôi đã lập mô hình bộ nhớ cục bộ bằng cách sử dụng sqlite và tương tác từ xa bằng cách sử dụng objective resource đối với ứng dụng đường ray và REST api. Nó có thể sử dụng xml hoặc json để tuần tự hóa dữ liệu.

Khi đối tượng được sửa đổi cục bộ, thay đổi đầu tiên được lưu vào bản ghi cơ sở dữ liệu sqlite cho đối tượng đó và sau đó được thêm vào hàng đợi được tuần tự hóa và lưu trữ trong db sqlite cục bộ. (Hàng đợi sau đó có thể được xử lý bất kỳ lúc nào)

Nếu có kết nối có sẵn, bất kỳ thay đổi cục bộ được xếp hàng nào sẽ được deserialized và thêm vào NSOperationQueue sau đó xử lý chúng trong nền.

Để thực hiện tất cả công việc này, tôi đã phân lớp NSOperation để nó có thể hỗ trợ nhiều loại hoạt động hàng đợi từ xa - tạo, cập nhật, xóa cơ bản bằng tài nguyên khách quan để thực hiện các yêu cầu từ xa.

Điều tốt đẹp về việc sử dụng NSOperationQueue và NSOperation là chúng xử lý luồng nền cho bạn vì vậy tôi khuyên bạn nên xem tài liệu táo cho các lớp đó và cũng tại quả táo threading guide.

Khi ứng dụng tải có một chút kiểm tra từ xa được thực hiện và xử lý trong nền để kéo xuống dữ liệu mới nhất - mặc dù thành thật mà nói, tôi vẫn đang thay đổi cách hoạt động này một chút.

Đó là tổng quan nhanh về những gì tôi đã phải đối phó với cho đến nay ... hy vọng nó sẽ giúp một chút.

1

Tự hỏi nếu bạn đã cân nhắc sử dụng Khung đồng bộ hóa để 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ộ.

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