2010-01-25 43 views
6

tôi tự hỏi nếu nó là một sự lựa chọn khôn ngoan để lưu trữ hình ảnh với dữ liệu cốt lõi vào bất động sản nhị phânCoreData (cho iphone) lưu trữ hình ảnh

nói rằng tôi có một bộ sưu tập các bộ phim và tôi muốn lưu hình ảnh bìa đĩa dvd thành một tài sản Kích thước trung bình của một trang bìa là 20/30kb (320x480px)

lý do tôi muốn làm điều này là để quản lý lưu trữ, một lần tôi xóa bộ phim tôi biết hình ảnh đó cũng bị xóa

tôi chỉ không hoàn toàn chắc chắn nếu đó là một ý tưởng tốt, tải dữ liệu, tốc độ?

bất kỳ ai có kinh nghiệm với điều này?

+0

Đây là bản sao của http://stackoverflow.com/questions/1168954/storing-large-eg-image-movie-files-in-core-data-on-the-iphone và http: // stackoverflow. com/questions/2090028/core-data-storage-images-iphone –

Trả lời

11

Dường như với tôi rằng lưu trữ hình ảnh trong dữ liệu cốt lõi không phải là một ý tưởng hay và tôi chắc chắn tôi cũng đã đọc nó trên một trong các hướng dẫn lập trình của Apple. Chỉ cần xem xét điều này, khi bạn tìm nạp bộ sưu tập của mình, tất cả hình ảnh cũng sẽ được tải vào bộ nhớ, ngay cả khi bạn chỉ hiển thị 8 hình ảnh, toàn bộ bộ sưu tập hình ảnh của bạn sẽ được tải bởi dữ liệu cốt lõi.

Nếu bạn muốn chắc chắn rằng bạn xóa các tập tin hình ảnh khi một kỷ lục di chuyển đã bị xóa tôi đề nghị bạn nghe thông báo bởi các managedObjectContext và xóa các tập tin khi một bộ phim đã bị xóa:

Bạn có thể đăng ký tham gia willSave hoặc đã lưu thông báo, mỗi thông báo đều có lợi thế/nhược điểm riêng.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:managedObjectContext]; 

Bắt các đối tượng bị xóa:

- (void) contextDidSave:(NSNotification *)notification 
{ 
    NSDictionary *userInfo = [notification userInfo]; 
    for (NSManagedObject *currObject in [userInfo objectForKey:NSDeletedObjectsKey]) 
    { 
     // Code for deleting file associated with the NSManagedObject, you can still 
     // access the managed object's properties. 
    } 
} 
+2

Không có gì sai với việc lưu trữ dữ liệu nhị phân trong dữ liệu lõi, đặc biệt là kích thước hình ảnh mà OP đang làm việc. Xem xét hai liên kết được đăng dưới dạng ghi chú cho câu hỏi. Mọi thứ dưới 100KB có thể dễ dàng được lưu trữ trực tiếp trong Dữ liệu cốt lõi. –

+1

Tất nhiên nó có thể được thực hiện, nhưng theo ý kiến ​​của tôi không phải là cách tốt nhất để làm điều đó, trừ khi bạn có thể kiểm soát nếu dữ liệu nhị phân thực sự được lấy và nạp vào bộ nhớ. Nếu không tìm nạp 100 bản ghi sẽ tải 2/3mb vào bộ nhớ mà không có lý do gì cả. –

+0

Tốt hơn là chỉ lưu trữ filepaths dưới dạng chuỗi trong coredata và tải chúng theo cách đó? – powerj1984

1

Nó xảy ra với tôi rằng bạn có thể sử dụng phương pháp khác mà có thể được tốt hơn nếu bạn đã subclassing NSManagedObject cho thực thể phim của bạn.

Bạn có thể triển khai phương thức didSave hoặc willSave trên NSManagedObject và chọn thuộc tính isDeleted. Nếu nó bị xóa, hãy xóa hình ảnh khỏi đĩa.

7

Phương pháp tốt nhất là lưu trữ đường dẫn đến hình ảnh trong đối tượng được quản lý và sau đó xóa tệp trong phương thức prepareForDeletion của đối tượng.

0

Xem câu trả lời của tôi trong:

Can I access the files used for external binary storage in Core Data?

Bạn có thể lưu trữ các file lớn trong Core Data hiện bằng cách sử dụng 'Cho phép bên ngoài lưu trữ' tùy chọn. Vấn đề duy nhất với điều này là không còn có quyền truy cập vào các tập tin thực tế bằng đường dẫn nữa, chỉ có dữ liệu nhị phân thuần túy. Tôi đã đưa ra một giải pháp 'sáng tạo' (cho dù thực hành tốt nhất là đoán bất kỳ ai), nhưng nó sẽ cho phép bạn sử dụng Dữ liệu cốt lõi để quản lý tệp của mình trong khi vẫn có thể truy cập tệp REAL theo đường dẫn của chúng.

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