There is not much you can do here for bootstrapping, you are as fast as you get. If it's still too slow, try uploading smaller images if you can.
Few things:
First, be careful with -imageWithContentsOfFile, it will not cache anything. You get a full hit every time you upload an image, unlike -imageNamed, which will save the image in cache. Of course, you can cache this in your domain object, but personally I strongly advise against this. Your memory will go through the roof, forcing you to implement your own cache expiration mechanism, while Apple has a very good image cache via -imageNamed. I would be surprised if you could work better than an apple on all three device families :)
Then you break the UITableView fly pattern here:
dispatch_sync(dispatch_get_main_queue(), ^{ cell.beerImage.image = image; beer.image = image; [cell setNeedsLayout]; });
Ask the table view to provide the cell with a specific index, rather than grab the cell in the block: by the time the image is loaded, this cell instance could be reused for another pointer path, and you would display the image in the wrong cell.
And no need here for -setNeedsLayout, just change the image.
Edit: screaming! I missed the obvious thing with table images. What are the sizes of your images, what is the size of the image, and what is the content mode of the image? If your images have a completely different size than the image type, and you ask to resize the image, this will happen in the main thread, and you will get massive performance. Resize the image to an image without a stream, after downloading (a quick Google search will give you the main graphic code for this).
source share