0

I'm building a messaging app, users of course can send text messages to each other, and now I want to add images sending support.

I have a NSManagedObject subclass ChatMessage to represent a chat message with properties like messageId, senderId, senderName, text, receiverId...

Now what is best practice to deal with the images?
I'm not talking about how to send and receive images, I'm talking about how to save them (when user get an image and when user upload and send an image)

Is it a good idea to add an image property to ChatMessage and save it with Core Data? or maybe save it to separate file? Do I need to resize them before saving? Should I expecte to have particular problems when I deal with images?

Eyal
  • 10,777
  • 18
  • 78
  • 130
  • Have you seen this: http://stackoverflow.com/questions/2090028/core-data-storing-images-iphone ? – Adam May 31 '12 at 16:17

1 Answers1

2

Eyal,

Core Data handles images well. In particular, in iOS v5 and Lion large BLOBs are stored outside of the persistent store. Small BLOBs are still stored in the DB. There are two caveats. First, in Core Data, it is very easy to create retain cycles, while this is never a good thing, a retain cycle involving large BLOBs will cause the OS to relatively quickly kill your process. As a result of this, the best practice is to create a leaf entity that just holds the BLOB and the inverse link. This makes it much less likely that you will create a retain cycle with the BLOB. I recommend that the relation to the BLOB be a to-one relationship. Second, large BLOBs cause memory warnings. Core Data does not appear to memory map these images into RAM. Hence, they cannot easily be automatically purged from your resident memory set. In my case, I have an app where I let CD handle the BLOBs. I also have an app where the BLOBs are quite large (12-24 MB). In the latter case, I handle the BLOB storage and memory mapping myself.

Whether you resize an image is really dependent upon your application and storage requirements/limitations. BLOB storage in CD doesn't affect this issue.

Andrew

adonoho
  • 4,339
  • 1
  • 18
  • 22
  • Thanks for your answer, I have two questions, as I said this is messaging app, users can sand pictures from their phone to other users (pictures from the camera roll or picture that the user just took) so: 1. How could I know what size those image gone be? is there some limit of size for pictures the user upload from his camera roll library? 2. Text msgs are small so it's not a problem but now I enable pictures so I'm afraid that users will upload a lot of pictures, those pictures will be save to device and then could it be that I will run out of space?? – Eyal Jun 03 '12 at 08:04
  • Eyal, Re: 1) There is almost always some mechanism to tell you the size of a BLOB. NSData, for example, will tell you the size of the item. 2) There is always a chance you can run out of storage space in any application. You just need to manage this. Both Core Data and the OS will tell you when they fail to save. Andrew – adonoho Jun 03 '12 at 13:32