Я подозреваю, что неправильные изображения, которые вы видите, являются следствием того, что вы не установили изображение заполнителя в случае, если у вас есть локальная копия изображения, но при этом вы все же получаете локальную копию асинхронно.Также в коде, который вы добавили для загрузки локальной копии, вы используете UIImage
a UIKit
компонент в фоновом потоке.
Также интересно, что вы, кажется, делаете какое-то UIImage
кэширование.Добавление изображений к тому, что я предполагаю, является свойством NSMutableArray
с именем imageFriends
.Но вы, кажется, закомментировали добавление кеша, если у вас есть локальная копия файла.Кроме того, в вашем опубликованном коде никогда не используется кэшированный UIImages
.
Хотя 2 уровня кэширования кажутся немного излишними, если вы хотите это сделать, вы можете сделать что-то вроде этого:
UIImage *userImage = [self.imageFriends objectForKey:[NSNumber numberWithInt:user.userId]];
if (userImage) { // if the dictionary of images has it just display it
cell.imageView.image = userImage;
}
else {
cell.imageView.image = [UIImage imageNamed:@"xger86x.jpg"]; // set placeholder image
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:user.image];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *imageData = nil;
if (fileExists){
imageData = [NSData dataWithContentsOfFile:user.image];
}
else {
imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:user.imageURL]];
[imageData writeToFile:user.image atomically:YES];
}
if (imageData){
dispatch_async(dispatch_get_main_queue(), ^{
// UIKit, which includes UIImage warns about not being thread safe
// So we switch to main thread to instantiate image
UIImage *image = [UIImage imageWithData:imageData];
[self.imageFriends setObject:image forKey:[NSNumber numberWithInt:user.userId]];
UITableViewCell *lookedUpCell = [tableView cellForRowAtIndexPath:indexPath];
if (lookedUpCell){
lookedUpCell.imageView.image = image;
[lookedUpCell setNeedsLayout];
}
});
}
});
}
UIImage
являются частью UIKit
и не безопасны для потоков.Но вы можете загрузить NSData
в другой поток.