2013-04-14 41 views
5

Vấn đề:Core Data vs NSFileManager

tôi đã được sử dụng trong một thời gian bây giờ hệ thống bộ nhớ cache của riêng tôi bằng cách sử dụng NSFileManager. Thông thường dữ liệu tôi nhận được là JSON và tôi chỉ lưu từ điển trực tiếp vào bộ nhớ cache (trong Thư mục Tài liệu). Khi tôi cần nó trở lại tôi sẽ chỉ nhận được nó. Tôi cũng thực hiện, đôi khi tôi cảm thấy nó tốt hơn, một NSDictionary trên thư mục gốc với các khóa/giá trị cho đường dẫn cho một tài nguyên nhất định. Ví dụ:

Tài nguyên về thời tiết ở Geneve 17/02/2013, vì vậy tôi sẽ có khóa được gọi là GE_17_02_2013 và giá trị đường dẫn đến NSDictionary với thông tin.

Thông thường, tôi không cần thực hiện bất kỳ truy vấn phức tạp nào. Nhưng, bằng cách nào đó, và từ những gì tôi đã đọc, khi bạn có rất nhiều dữ liệu, bạn nên gắn bó với Dữ liệu cốt lõi. Trong trường hợp của tôi, tôi thường có rất nhiều dữ liệu, nhưng tôi chưa bao giờ thực sự cảm thấy ứng dụng đang đi xuống, hoặc bị ảnh hưởng về hiệu suất. Vì vậy, câu hỏi của tôi là:

  1. Trong trường hợp này, nơi mà thỉnh thoảng (điều tiết chỉ là một ví dụ ) Tôi cần phải chỉ cần loại bỏ tất cả các dữ liệu (một cấp dữ liệu Twitter, cho chẳng hạn) và thay thế nó bằng một luồng dữ liệu hoàn toàn mới, là Core Dữ liệu có giá trị không? Tôi nghĩ rằng loại bỏ tất cả các dữ liệu, và chèn (populating) nó, là nặng hơn chỉ cần lưu trữ các NSDictionary và thay thế cũ.

  2. Đôi khi nó sẽ envolve hình ảnh, textfiles, vv và NSFileManager làm nó một cách hoàn hảo, vì vậy những gì ưu điểm cốt lõi Dữ liệu có thể mang lại trong trường hợp này?

Tái bút: Tôi chỉ thấy this bưu điện, nơi loại câu hỏi được thực hiện và số chứng minh cái nào là thực sự nhanh hơn. Tuy nhiên, tôi cũng muốn một câu trả lời thực nghiệm.

Trả lời

2

Dữ liệu cốt lõi đáng được sử dụng trong mọi trường hợp bạn mô tả. Trên thực tế, nếu một ứng dụng lưu trữ nhiều hơn tùy chọn, có thể bạn nên sử dụng Dữ liệu cốt lõi. Dưới đây là một số lý do, trong số đó, bạn sẽ tìm thấy câu trả lời cho các vấn đề của riêng bạn:

  • chắc chắn nhanh hơn hệ thống tệp ngay cả khi bạn xóa sạch mọi thứ và viết lại. hưởng lợi nhiều từ việc lưu vào bộ nhớ đệm). Điều này là cơ bản bởi vì bạn có thể kết hợp các hoạt động của bạn và chỉ truy cập vào cửa hàng khi cần thiết. Vì vậy, nếu bạn đọc, viết và đọc, bạn có thể lưu chỉ một lần, phần còn lại được thực hiện trong bộ nhớ, đó là, không cần phải nói, rất nhanh.
  • mọi thứ được phiên bản và bạn có thể dễ dàng di chuyển từ phiên bản này sang phiên bản khác (trong khi vẫn giữ nội dung người dùng có trên thiết bị)
  • 80% hoạt động mô hình của bạn miễn phí. Giống như, khi một cái gì đó thay đổi, bạn có thể ghi đè lên phương thức đối tượng được quản lý willSave và thông báo cho bộ điều khiển của mình.
  • sử dụng cascade làm cho nó tầm thường để xóa các cấu trúc đối tượng thậm chí rất phức tạp
  • khi là một ý tưởng tồi để giữ hình ảnh trong cơ sở dữ liệu, bạn vẫn có thể giữ chúng trên hệ thống tập tin và có dữ liệu cốt lõi xóa chúng tự động khi đối tượng quản lý mà đại diện cho họ bị xóa
  • thật linh hoạt, trên thực tế bạn có thể di chuyển dự án của mình bằng cách sử dụng hệ thống tệp cục bộ để sử dụng máy chủ với rất ít sửa đổi bằng cách viết kho lưu trữ dữ liệu tùy chỉnh.
  • trình thiết kế dữ liệu cốt lõi về cơ bản tạo các đối tượng mô hình cho bạn. Bạn không cần phải tạo các lớp mô hình của riêng bạn (mà bạn sẽ phải sử dụng nếu sử dụng hệ thống tệp)
+0

bộ nhớ cache dành cho các tình huống ngoại tuyến. Vì vậy, trong điều kiện bình thường với truy cập internet, tôi thường thay thế dữ liệu được lưu trữ rất thường xuyên, đó là lý do tại sao tôi có mối quan tâm. Một lợi thế khác, là thực tế chỉ sử dụng một 'NSDictionary' và không cần phải biết những gì bên trong của anh ta (cách anh ta sáng tác). Nó có ý nghĩa khi có 'NSManagedObject' chỉ với một' NSDictionary'? – Peres

+0

Bộ nhớ đệm cũng quan trọng đối với hệ thống tệp cục bộ. Truy cập hệ thống tập tin chậm hơn truy cập bộ nhớ. Tôi không chắc tại sao bạn không cần phải biết những gì bên trong từ điển đó, bạn không đọc/giải thích nó như là một số điểm.Nếu bạn chỉ lưu trữ một tệp giống như bất kỳ phần mềm nào khác, đó là từ điển được tuần tự hóa, thì có, không có điểm nào trong việc sử dụng Dữ liệu chính –

+0

Ý tôi là, tôi biết nội dung bên trong, nhưng nếu vì lý do nào đó, API sẽ thay đổi và thêm những thứ khác , Tôi không bị ràng buộc với điều đó. – Peres

1

Trong trường hợp này ... là dữ liệu cốt lõi đáng giá không?

Có, trong phạm vi bạn cần quản lý tập trung hơn là cố gắng vẽ lược đồ hệ thống tệp của riêng bạn. Dữ liệu cốt lõi và SQL người anh em họ cấp thấp của nó, vẫn là lựa chọn tốt nhất cho sự kiên trì mà chúng ta có ngay bây giờ. Bên cạnh đó, hiệu suất hit sử dụng NSKeyed(Un)Archiver để tiếp tục tuần tự hóa/deserializing một từ điển hơn và hơn nữa trở nên ngày càng đáng chú ý với bộ dữ liệu lớn hơn.

Tôi nghĩ rằng xóa tất cả dữ liệu và chèn (populating), nặng hơn thay vì lưu trữ NSDictionary và thay thế cũ.

Tuyệt đối, có. Nhưng, bạn không phải suy nghĩ về doanh thu bộ nhớ cache như thế. Nếu bạn tưởng tượng Dữ liệu cốt lõi là một mô hình tĩnh, bạn có thể sử dụng lớp bộ nhớ cache để chuyển dữ liệu vào và ra khỏi cửa hàng. Cần tài nguyên đó về thời tiết? Kiểm tra lớp bộ nhớ cache. Nếu nó không có trong đó, làm cho bộ nhớ cache chạy một yêu cầu tìm nạp. Cần phải lật qua toàn bộ bộ nhớ cache? Để trống bộ nhớ cache, sau đó chạy một yêu cầu để đánh dấu mọi thực thể với một số loại cờ để cho thấy chúng không hợp lệ. Việc xóa đắt tiền mà bạn đang lo lắng có thể được thực hiện bằng một quá trình nền khi bạn thấy rằng tất cả dữ liệu mới của bạn đã được lưu trữ an toàn trong bộ nhớ cache.

Đôi khi nó sẽ envolve hình ảnh, textfiles, vv và NSFileManager làm nó một cách hoàn hảo, vì vậy những gì lợi thế Core Data có thể mang lại trong trường hợp này?

Thật không may, không nhiều. Đối với các blobs dữ liệu (về cơ bản là những gì Core Data thực hiện trong các tình huống này), việc lưu trữ và tìm nạp dữ liệu từ Core Data có thể nhanh chóng tốn kém. Họ cũng có thể chiếm một không gian lớn hơn đáng kể trên đĩa nếu chúng không được nén (làm giảm hiệu suất). Nếu bạn cần một giải pháp thay thế nhanh hơn, hãy sử dụng một cửa hàng phù hợp hơn với công việc như Tokyo Cabinet hoặc LevelDB và sử dụng các thực thể trong kho dữ liệu cốt lõi như một loại đứng trong đó, có thể chứa khóa cho tài nguyên ở một trong những cơ sở dữ liệu quan hệ đó.

+0

Tôi sử dụng cơ chế đó (vô hiệu) với phương pháp 'NSFileManager'. Với số lượng lớn dữ liệu. Cảm ơn Robert. – Peres

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