2010-01-18 40 views
46

Tôi có một ứng dụng mà tôi cho phép người dùng thêm hình ảnh cho tài khoản của họ.Dữ liệu cốt lõi - Lưu trữ hình ảnh (iPhone)

Tôi muốn biết cách lưu trữ ảnh (lấy từ thư viện ảnh hoặc thư viện ảnh) sử dụng Dữ liệu lõi, vì tôi có thể cung cấp cơ sở dự phòng cho người dùng và muốn chuyển dữ liệu hình ảnh sang máy chủ .

Tôi đã đi qua đề xuất thiết kế tạo đối tượng mô hình Image và tạo mối quan hệ 1 đến 1 với đối tượng mô hình User (để đối tượng Hình ảnh được liên kết không được gọi trừ khi được yêu cầu). Tuy nhiên, tôi không chắc chắn làm thế nào để lưu trữ thực tế hình ảnh và liệu điều này có khả năng gây tử vong về mặt hiệu suất hay không.

Tôi sẽ biết ơn vì bất kỳ lời khuyên nào về cách tiếp cận và cạm bẫy của bất kỳ ai đã cố gắng thực hiện điều này.

Trả lời

84

Nguyên tắc để lưu trữ dữ liệu hình ảnh trong Core Data là như sau:

  • < 100 cửa hàng kb trong thực thể có liên quan (người, địa chỉ, bất cứ điều gì).
  • < 1 mb lưu trữ trong một thực thể riêng biệt ở đầu kia của mối quan hệ để tránh các vấn đề về hiệu suất.
  • 1 mb lưu trữ trên đĩa và tham chiếu đường dẫn trong kho dữ liệu cốt lõi của bạn.

Bạn có thể sử dụng các kiểu dữ liệu năng biến để lưu trữ các NSImage trực tiếp vào Core Data. Trong thực tế, bạn có thể sử dụng kiểu dữ liệu có thể biến đổi để lưu trữ bất cứ thứ gì thực hiện giao thức NSCoder.

Cá nhân tôi sẽ không chuyển đổi nó thành CGImageRef vì bạn có thể mất rất nhiều thông tin theo cách đó.

+0

Tôi đang bối rối, bạn có nói rằng bạn sẽ không lưu trữ một hình ảnh cho một thực thể dữ liệu cốt lõi bằng cách sử dụng một kiểu dữ liệu biến đổi? – memmons

+0

No. Tôi đang nói rằng tùy thuộc vào kích thước của hình ảnh bạn sẽ muốn lưu trữ nó trong một thực thể riêng biệt hoặc trên đĩa. Hình ảnh lớn gây ra sự cố với bộ nhớ cache. –

+2

Có một số cách mới thú vị để giúp bạn tiết kiệm từ rắc rối đó trong iOS5. Kiểm tra tài liệu, tài liệu vẫn thuộc NDA. – steipete

3

Bạn sẽ cần phải có một một một, sau đó bạn có thể có thể làm một cái gì đó như thế này:

CGImageRef imageRef = uiImage.CGImage; 
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef); 
NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider); 
[managedObject setValue:imageData forKey:@"data"]; 

đâu managedObject là cốt lõi đối tượng hình ảnh dữ liệu của bạn và @ "dữ liệu" là tên của thuộc tính nhị phân. Bạn cũng có thể cần phải lưu định dạng hình ảnh để deserialize hình ảnh sau này.

Tùy chọn khác là lưu hình ảnh vào đĩa và lưu trữ đường dẫn trong dữ liệu lõi.

+0

cũng, giải phóng imageData khi bạn hoàn tất. – Elfred

+0

Ngoài ra, hãy kiểm tra bằng cách sử dụng Thuộc tính có thể chuyển đổi: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html – Nimrod

+0

Xin lỗi, tôi biết điều này có vẻ như là một câu hỏi cơ bản nhưng cách bạn đi về (và những gì có nghĩa là bởi) lưu các định dạng hình ảnh? Tôi đã không đi qua ý tưởng này trước đây. – Urizen

4

Sự cố: Bạn có thể kết thúc rất lớn, khó xử lý cơ sở dữ liệu sqlite. Bạn có thực sự muốn người dùng tải lên một vài tệp MB trong một bước tới máy chủ không? Bạn làm gì, nếu kết nối celluar bị hỏng trong vài giây?

Tôi nghĩ sẽ tốt hơn nếu bạn sử dụng Dữ liệu cốt lõi để quản lý hình ảnh và trạng thái tải lên của họ (được tải lên: có hoặc không). Bằng cách này, bạn có thể tải lên các hình ảnh, khi nó phù hợp với quy trình làm việc của ứng dụng của bạn. Được rồi, nó sẽ kéo dài lâu hơn một chút, vì có nhiều kết nối. Nhưng là một cách tiếp cận rõ ràng hơn, tôi nghĩ ...

Khi bạn nghĩ về iTunes, khi nói về bản sao lưu: Thư mục 'Documents' iPhone cục bộ của bạn vẫn được đồng bộ hóa.

+0

Cảm ơn bạn đã trả lời. Tôi có thể đi xuống các tuyến đường chỉ đơn giản là lưu trữ các đường dẫn như một chuỗi và sau đó đếm trên iTunes để cung cấp sao lưu của tập tin hình ảnh (trong khi lưu trữ các tài khoản khác liên quan đến dữ liệu trên máy chủ từ xa). – Urizen

29

Thời gian trôi qua kể từ khi câu hỏi này được hỏi nhưng tôi muốn chia sẻ kinh nghiệm của mình về vấn đề này.


Tôi sẽ không khuyên bạn lưu trữ hình ảnh bên trong DB nếu số của chúng không bị giới hạn. Bạn nên luôn nhớ rằng một ngày nào đó bạn sẽ thêm phiên bản mới của mô hình dữ liệu và bạn sẽ phải di chuyển từ DB cũ sang phiên bản mới trên Bản cập nhật ứng dụng. Nó cần có thời gian. Tệp DB càng lớn thì bạn càng mất nhiều thời gian để di chuyển.

Nếu bạn muốn lưu trữ hình ảnh trong DB, hãy đảm bảo bạn không thêm cửa hàng liên tục trong phương thức application: didFinishLaunchingWithOptions:UIApplicationDelegate. iOS sẽ chấm dứt ứng dụng của bạn nếu quá trình di chuyển sẽ không hoàn thành sau XX giây.

+1

Cảm ơn bạn +1 cho nhận xét đó :-) – PeterK

+0

Bạn có thể đăng nguồn tham khảo đáng tin cậy cho nhận xét bạn đã thực hiện về "iOS sẽ chấm dứt ứng dụng của bạn nếu quá trình di chuyển không hoàn tất sau 30 giây"? – Pavan

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