The problem is you are loading the image data on the main thread - that's bad. You also try to do a lot of UI work in the background. Try this:
^(BOOL success, NSDictionary *response, NSError *error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
[loadingImageView startAnimating];
});
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:userSubmission.storageUri]];
NSLog(@"Is Main Thread: %ld", (long)[NSThread isMainThread]);
userSubmission = [[Submission alloc] initWithDictionary:response];
dispatch_async(dispatch_get_main_queue(), ^{
[self setImage:[UIImage imageWithData:imageData]];
if (userSubmission.votes) {
_numberOfVotesSubmissions.text = [NSString stringWithFormat:@"%ld", (long)userSubmission.votes];
} else {
_numberOfVotesSubmissions.text = @"0";
}
_votesOrSubmissionsImage.image = [UIImage imageNamed:@"list_votes_icon"];
[loadingImageView stopAnimating];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
_numberOfVotesSubmissions.text = [NSString stringWithFormat:@"%ld", (long) _clue.submissions];
_votesOrSubmissionsImage.image = [UIImage imageNamed:@"list_photo_icon"];
});
}
}];