2010-08-12 32 views
6

Tôi có một số câu hỏi cơ bản về dữ liệu cốt lõi (mà tôi mới) và tôi muốn một số quan điểm về các tiêu chuẩn và triển khai hiện tại. Về cơ bản tôi có một ứng dụng trên iPhone (hỗ trợ iOS 3.0 trở lên) nhận được nhiều dữ liệu từ các cuộc gọi web qua HTTP, Im xem xét việc di chuyển kết quả vào bộ nhớ cục bộ để truy xuất nhanh trong lần tiếp theo người dùng có thể tải cùng một dữ liệu một lần nữa (dữ liệu không thay đổi, đó là lý do tại sao tôi có thể dựa vào phiên bản được lưu trong bộ nhớ cache là chính xác).Câu hỏi dữ liệu cốt lõi về cách sử dụng thông thường

Tôi chỉ muốn biết một vài điều đầu tiên:

  1. Có phải mọi người những ngày này đối xử với các đối tượng quản lý mà mở rộng NSManagedObject như các đối tượng miền, hay bạn tạo các lớp riêng biệt nghiêm cho việc lưu trữ và tạo ra phương pháp helper để tạo chúng thành các đối tượng miền? Đôi khi tôi tìm thấy giữ tất cả logic bền bỉ ra khỏi miền để trở thành một điều tốt.

  2. Còn việc dọn dẹp thì sao? Làm cách nào để xóa dữ liệu khi ứng dụng đóng hoặc có thể hết hạn dữ liệu trong bộ nhớ cục bộ? Tôi chắc chắn không muốn giữ dữ liệu trên điện thoại người dùng mọi lúc.

  3. Có loại nguyên tử nào với dữ liệu lõi không? Việc triển khai của tôi trước tiên sẽ kiểm tra dữ liệu cục bộ trước khi nhấn vào các dịch vụ web, tôi muốn đảm bảo rằng không bao giờ một nửa tập dữ liệu được cam kết lưu trữ cục bộ và nhận được kết quả buồn cười.

  4. Tôi muốn chạy một vài chuỗi nền tảng công bằng để tìm nạp dữ liệu trong nền, có bất kỳ điều gì tôi cần xem xét khi duy trì các đối tượng trên một chuỗi nền không?

  5. Liên quan đến câu hỏi trên, cách tốt nhất để tạo vòng lặp "tìm nạp nền" là gì? Trong ứng dụng đại biểu? Mỗi lượt xem, tùy thuộc vào chế độ xem? v.v ...?

Tôi hy vọng đây không phải là quá cơ bản :)

Nhờ sự giúp đỡ bạn có thể cho.

Trả lời

5

Có phải mọi người những ngày này đối xử với quản lý đối tượng mở rộng NSManagedObject như đối tượng tên miền, hoặc để bạn tạo lớp riêng biệt nghiêm cho việc lưu trữ và tạo phương pháp helper để tạo chúng thành các đối tượng miền? Thỉnh thoảng, tôi tìm tất cả các logic liên tục trong số miền là một điều tốt.

Nếu bạn tạo các đối tượng miền hoàn toàn độc lập, bạn phải chi phí giữ cho chúng đồng bộ với mô hình lõi dữ liệu của bạn, và giữ bản dịch giữa các dữ liệu cốt lõi và các đối tượng làm việc - ngoài ra bạn có các đối tượng trùng lặp trong bộ nhớ, tùy thuộc về bao nhiêu đối tượng bạn có này có thể là một mối quan tâm.

Tuy nhiên, mặt lợi ích của việc sử dụng các đối tượng miền riêng biệt là bạn không còn được gắn bó với ngữ cảnh đối tượng được quản lý nữa. Một trường hợp mà một thứ như thế có thể làm hại bạn là nếu bạn duy trì các tham chiếu đến các đối tượng được quản lý và sau đó một số thao tác nền gây ra bối cảnh đối tượng được quản lý chính để loại bỏ các đối tượng - bây giờ nếu bạn truy cập bất kỳ thuộc tính nào trong đối tượng được quản lý đã bị xóa, bạn kích hoạt một lỗi ngoại lệ (ngay cả khi bạn đã rõ ràng có đối tượng được tải không có dữ liệu bị lỗi).Một điều tôi đã thử với sự thành công vừa phải là các đối tượng dữ liệu riêng biệt rất nhẹ cho các mục đích cụ thể - những gì tôi đã làm là xác định một giao thức để đại diện cho các đối tượng dữ liệu, với cùng tên với các trình truy cập dữ liệu cốt lõi. Sau đó, tôi đã có cả đối tượng dữ liệu lõi và một đối tượng dữ liệu độc lập tùy chỉnh thực hiện giao thức này, và có một cơ chế để tự động sao chép các thuộc tính từ một đến cái kia. Vì vậy, tôi đã không làm tất cả các đối tượng như là tùy chỉnh, và có thể điều trị các đối tượng hoặc đến từ các cửa hàng địa phương hoặc độc lập thay thế cho nhau.

Tôi chưa có sở thích rõ ràng về điều này nhưng hãy sử dụng trực tiếp các đối tượng được quản lý vì thiếu sự trùng lặp. Bạn có thể giảm thiểu các tác dụng phụ xấu bằng cách lắng nghe các thay đổi hoặc sử dụng lớp điều khiển dữ liệu lõi.

Một điều giúp giữ cho đối tượng miền và đối tượng dữ liệu sắp xếp giống nhau, không sử dụng bộ tạo mogener để tạo đối tượng dữ liệu. Nó tạo ra các biểu diễn đối tượng rất đẹp của các đối tượng trong kho dữ liệu cốt lõi của bạn, cộng với các đối tượng front-end mà bạn có ý định chỉnh sửa - thêm các trình tiếp cận tùy chỉnh hoặc các phương thức phức tạp. Khi thay đổi bộ lưu trữ dữ liệu, bộ tạo mogenerator sẽ tái tạo đối tượng dữ liệu nhưng chỉ để lại mã tùy chỉnh của bạn.

http://rentzsch.github.com/mogenerator/

gì về dọn dẹp? Cách thường xóa tất cả dữ liệu khi ứng dụng đóng hoặc có thể hết hạn dữ liệu trong bộ nhớ cục bộ? Tôi chắc chắn không muốn giữ dữ liệu trên điện thoại của người dùng mọi lúc.

Dữ liệu thường đủ nhỏ để tôi để ở đó, với dấu thời gian hết hạn để sử dụng để bạn biết khi nào dữ liệu quá cũ để sử dụng trực tiếp. Có rất nhiều giá trị để giữ dữ liệu xung quanh vì người dùng đóng và mở lại ứng dụng thường xuyên và với dữ liệu đã có, bạn có thể hiển thị kết quả ngay lập tức trong khi vẫn tìm nạp nội dung cập nhật.

Có loại nguyên tử nào với Dữ liệu cốt lõi không? Việc triển khai của tôi sẽ trước tiên hãy kiểm tra dữ liệu cục bộ trước khi đánh các dịch vụ web, tôi muốn để đảm bảo rằng không bao giờ có một nửa số một tập dữ liệu được cam kết lưu trữ cục bộ và nhận kết quả hài hước.

Nguyên tử đến trong đó bạn thực hiện các thao tác trong ngữ cảnh và sau đó cho biết ngữ cảnh cần lưu. Vì vậy, nguyên tử thật sự có nghĩa là tránh các thành phần khác phát hành một lưu trước khi bạn đã sẵn sàng, mà thường có nghĩa là làm một cái gì đó trong bối cảnh riêng của nó và sáp nhập trở lại vào một bối cảnh tổng thể.

Tôi muốn chạy một vài chủ đề nền công bằng để lấy dữ liệu trong nền, được có bất kỳ điều tôi sẽ cần phải xem xét khi kiên trì đối tượng trên một sợi nền?

Mỗi chủ đề nền cần ngữ cảnh riêng, bạn nên nghe thông báo lưu và hợp nhất vào ngữ cảnh chính tại thời điểm đó.

Bạn nên cố gắng hết sức để tránh các yêu cầu trùng lặp có thể tiết kiệm cho cùng một đối tượng gần như cùng một lúc, điều này đôi khi có thể gây ra lỗi dữ liệu lõi khi hợp nhất.Liên quan đến điều đó - thiết lập chính sách hợp nhất trên ngữ cảnh chính của bạn vì chính sách mặc định là ném một ngoại lệ.

Điều đó cũng có nghĩa là khi làm mô hình, hãy tìm nhiều đối tượng riêng biệt như bạn có thể có thể thay vì một đối tượng lớn tập hợp dữ liệu từ nhiều nguồn khác nhau.

Để biết thêm thông tin về tiết kiệm và sáp nhập vào bối cảnh khác, xem câu hỏi này:

CoreData and mergeChangesFromContextDidSaveNotification

Liên quan đến câu hỏi trên, gì là cách tốt nhất để tạo ra một "nền lấy "vòng lặp? Trong ứng dụng đại biểu? Mỗi lượt xem, tùy thuộc vào chế độ xem ? v.v ...?

Tôi thích làm điều này từ một lớp singleton riêng biệt (sau khi tất cả, AppDelegate chính nó là một singleton ...), tôi có thể yêu cầu bối cảnh đối tượng được quản lý chính ngoài ngữ cảnh cụ thể cho một chủ đề .

Điều này cũng hữu ích khi bắt đầu một dự án Dữ liệu cốt lõi mới, bạn không phải sử dụng mẫu Dữ liệu cốt lõi và chỉ có thể sử dụng lại trình quản lý dữ liệu lõi này.

+0

Thứ nhất, cảm ơn bạn đã dành thời gian cho câu trả lời của bạn, +1 để biết chi tiết. Tôi chỉ có một vài câu hỏi tiếp theo, 1. Bạn có thể giải thích thêm một chút về nguyên tử không? Tôi chỉ không thực sự theo bạn về điều đó. 2. Bạn đề cập đến một bối cảnh tổng thể, và sáp nhập, Im không quen thuộc với những điều này, bạn có thể cũng xây dựng trên những có lẽ? 3. Làm thế nào để bạn quản lý các bối cảnh khác nhau cho mỗi chủ đề? Nó chỉ là vấn đề nhận được một bối cảnh tại việc tạo ra một sợi, sau đó một khi các chủ đề được thực hiện 'trở về' bối cảnh đó để các chủ đề chính và sáp nhập? – Mark

+0

1) Bạn thực hiện các thao tác bạn cần trên các đối tượng được quản lý - không có thay đổi nào "dính" cho đến khi bạn lưu ngữ cảnh. Loại bỏ bối cảnh (hoặc hoàn nguyên các thay đổi) giống như một sự quay lại. Đối với 2-3 - Ý tưởng là bạn có một ngữ cảnh cho chuỗi chính. Trong bất kỳ thao tác nền nào bạn tạo một bối cảnh mới, dựa trên cùng một kho đối tượng được quản lý, sau đó lưu nó khi chỉnh sửa xong - có một thông báo đặc biệt mà bạn có thể tìm kiếm, trong phương thức đó bạn có thể yêu cầu hợp nhất vào ngữ cảnh chính. Xem http://stackoverflow.com/questions/1429900/coredata-and-mergechangesfromcontextdidsavenotification –

+0

Ok, tôi thấy những gì bạn đang nói, cảm ơn một lần nữa, nếu bạn không nhớ tôi muốn tiếp tục hỏi thêm một số câu hỏi, tôi biết trang web này thực sự không được thiết lập cho một cuộc thảo luận ... tại sao bạn cần các thuộc tính trong 'NSManagedObject' là @dynamic? Nếu bạn sử dụng chúng như các đối tượng miền, sẽ không dễ dàng hơn khi sử dụng @synthesize, nhưng tôi sẽ gặp lỗi khi tôi thay đổi nó qua ... – Mark

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