2012-05-05 35 views
18

Tôi đã nhìn thấy NSIncrementalStore bật lên khi tôi đang nghiên cứu các cách tốt nhất để tương tác với dịch vụ web bằng dữ liệu lõi.Giải thích về NSIncrementalStore bằng tiếng Anh đơn giản

Sau khi đọc an article by Drew Crawford, a programming guide, a class referenceand this tutorial một vài lần mỗi tôi vẫn phải vật lộn tìm hiểu những gì NSIncremental cửa hàng là, tại sao và khi nào bạn sẽ sử dụng nó.

Có thể ai đó vui lòng giải thích nó?

Chỉnh sửa
sau khi đọc câu trả lời của mundi Tôi có thể thấy thêm ngữ cảnh nào đó. Tôi đang xem xét sử dụng dữ liệu cốt lõi cùng với dịch vụ web mà tôi đang xây dựng. Tôi đang cố gắng tìm cách tốt nhất để lưu trữ thông tin người dùng cục bộ trên thiết bị và đăng lên dịch vụ web khi có kết nối. Sự thiếu hiểu biết của tôi về dữ liệu cốt lõi đã thúc đẩy nghiên cứu của tôi, nhưng tôi không thể hiểu đầy đủ tính hữu ích của NSIncrementalStore.

Trả lời

33

LƯU Ý: API này đã xuất hiện khi tôi viết bài này vào năm 2012 và chi tiết đã thay đổi. Hãy cập nhật điều này nếu bạn muốn. Tôi không làm việc trên bất kỳ dự án Cocoa/ObjC nào vào lúc này vì vậy tôi không phải là người tốt để giữ cho cập nhật này, thật không may. Dường như ý chính xác là chính xác.

Dữ liệu chính cung cấp một bộ công cụ giúp quản lý sự kiên trì đối tượng, tức làkhả năng lưu và sau đó tìm lại bộ đối tượng (NSManagedObject) từ một số loại bộ nhớ.

Khi bạn làm việc với các đối tượng Dữ liệu cốt lõi, bạn làm như vậy bằng cách sử dụng NSManagedObjectContext, mà bạn nhận được từ một số NSPersistentStoreCoordinator. PSC lần lượt nói chuyện với một hoặc nhiều hơn NSPersistentStore lớp con, xử lý các hoạt động thực tế trên cửa hàng. (Hãy suy nghĩ tạo/đọc/cập nhật/xóa dựa vào cơ sở dữ liệu.)

Dữ liệu chính hỗ trợ hai loại cửa hàng chính: NSPersistentStoreNSAtomicStore. Một cửa hàng liên tục có thể được coi như một cơ sở dữ liệu: bạn có thể lưu dần, cập nhật và tìm nạp các tập bản ghi tùy ý từ nó. Một cửa hàng nguyên tử là một đại diện 'tất cả hoặc không' của một đồ thị đối tượng. Nó được dự định là một đại diện trong bộ nhớ của một tập tin có cấu trúc.

Các loại cửa hàng Core Data đi kèm với là:

  • NSSQLLiteStoreType (NSPersistentStore)
  • NSInMemoryStoreType (NSPersistentStore)
  • NSXMLStoreType (NSAtomicStore)
  • NSBinaryStoreType (NSAtomicStore)

NSPersistentStore rõ ràng bị cấm được phân loại, vì vậy cho đến bây giờ, không có cách nào để tạo chương trình phụ trợ cửa hàng không nguyên tử của riêng bạn. Đó là, nếu bạn muốn tồn tại và truy vấn đại diện của các đối tượng của bạn từng phần như trái ngược với trong một khối lớn ('tải toàn bộ đồ thị', 'lưu toàn bộ đồ thị') bạn đã không may mắn. Cho đến khi iOS5 giới thiệu NSIncrementalStore.

NSIncrementalStore là lớp trừu tượng (xuống từ NSPersistentStore) có phương pháp bạn triển khai để cung cấp bộ điều hợp giữa kho dữ liệu mà bạn kiểm soát và thế giới của Dữ liệu cốt lõi. Bạn có thể sử dụng nó để bọc một API từ xa, hoặc nếu bạn nghiêng đến mức bạn có thể bọc một cái gì đó như NULevelDB hoặc NanoStore (mặc dù tôi không chắc chắn tại sao bạn lại làm điều đó).

+0

+1 Rất tốt giải thích. – fatuhoku

+0

Tôi nghĩ rằng bạn có nghĩa là để nói 'NSIncrementalStore' và NSAtomicStore, không phải là" 'NSPersistentStore' [đó là lớp cơ sở] và NSAtomicStore". –

+0

Candidly Tôi không có ý tưởng - Tôi đã viết này 4 năm trước và đã không viết bất kỳ mã cho iOS trong khoảng một khoảng thời gian tương tự. Lấy làm tiếc! – jdc

5

Tóm lại, nếu bạn sử dụng kho lưu trữ SQLite với Dữ liệu cốt lõi của mình, bạn đã sử dụng một cửa hàng gia tăng. Tất cả lợi ích của các cửa hàng gia tăng (tức là chủ yếu không phải tải toàn bộ cửa hàng vào bộ nhớ) đã sẵn sàng để bạn sử dụng.

Đối với ứng dụng cụ thể của API NSIncrementalStore, tôi khuyên bạn trước tiên nên xác định chính xác vấn đề bạn muốn giải quyết. Nếu bạn yêu cầu API này hoặc không sẽ được xác định bởi nhu cầu cụ thể của nhiệm vụ lập trình của bạn.


EDIT để đáp lại câu hỏi chỉnh sửa

tôi chỉ cần làm điều đó như thế này: Trong bạn thực thể cốt lõi Dữ liệu về thiết bị mà bạn có thể có một thuộc tính BOOL uploaded. Khi dịch vụ web khả dụng, hãy bắt đầu tải lên và kéo tất cả các đối tượng không phải là uploaded.

Để tải lên, chuyển đổi các đối tượng của bạn thành NSArrayNSDictionary, có thể thành định dạng JSON và POST vào trang web của bạn. Khi trang web trả lời rằng nó đã lưu dữ liệu, hãy đánh dấu tất cả các đối tượng là uploaded.

+0

Vui lòng xem chỉnh sửa của tôi, cảm ơn – MrJD

+0

Vui lòng xem * my * edit. – Mundi

+0

Đó là một cách thông minh để làm điều đó. Tôi đã nghĩ rằng tôi có thể sử dụng NSIncrementalStore để viết cho cả db cục bộ và thử db web. Tôi sẽ phải sử dụng nhiều hơn một chút của một hệ thống phức tạp hơn những gì bạn đã vạch ra để thiết bị biết những gì để tải lên thay vì tất cả mọi thứ. Cảm ơn. Tôi vẫn mở để gợi ý và câu trả lời vì vậy tôi sẽ để lại điều này chưa được trả lời trong một thời gian. Cảm ơn – MrJD

9

Bạn sẽ sử dụng NSIncrementalStore để truy cập máy chủ từ xa thông qua Dữ liệu chính. Thay vì đọc và ghi vào một tệp cục bộ, bạn sẽ đẩy yêu cầu tới máy chủ và nhận phản hồi mà bạn muốn đưa vào Dữ liệu chính. Tương tự như vậy để lưu, v.v.

Lưu ý, tuy nhiên, điều này không quan trọng để thực hiện. Đó là một tính năng rất mạnh mẽ, nhưng trừ khi bạn là chuyên gia trong việc sử dụng Core Data, tôi sẽ không khuyến khích nó, vì có vô số cơ hội để tự bắn mình trong chân trừ khi bạn biết rất nhiều về cách tương tác của Core Data với lớp lưu trữ công trinh.

Nếu sử dụng uploaded giải quyết vấn đề của bạn, hãy thực hiện việc đó thay thế.

+0

Cảm ơn, tôi hiểu rằng dữ liệu cốt lõi chạy trên luồng chính và cho dữ liệu cốt lõi để sử dụng điều này sẽ không khóa khóa chính trong khi tải lên/tải xuống đang chạy? Hơn nữa hiện nó 'thay thế' db sqlite địa phương? – MrJD

+4

Không. Dữ liệu cốt lõi có thể chạy trên bất kỳ luồng nào. Nó không phải là luồng an toàn: Bạn cần có một ngữ cảnh cho mỗi hàng đợi (hoặc luồng nếu bạn chưa có GCD). Cũng giống như bất cứ điều gì khác mà không phải là thread an toàn. –

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