A download is still in progress when you pop your view controller. So when the asynchronous callback is executed, your [collectionView reloadItemsAtIndexPaths...]
gets called on a collectionView
that no longer exists.
You should check that collectionView != nil
on the first line of your callback block, and simply return;
if it's nil:
dispatch_async(dispatch_get_main_queue(), ^{
if (collectionView == nil)
return;
[record setValue:[UIImage imageWithData:imageData] forKey:@"actualImage"];
[collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
});