Я загружаю набор изображений для определенной ячейки, и он работает нормально, только если я жду, пока все изображения загружены, я использую нить для извлечения изображений из Интернета, проблема заключается в том, что при прокрутке табличного представления во время загрузкипроцесс все еще продолжается, он сгенерирует изображение в неправильном положении ячейки.Я знаю, что это неправильная позиция, потому что я также установил метку для каждого набора изображений.Любая помощь будет признательна, спасибо заранее !!!!
вот пример кода.
- (void)viewDidLoad{
[super viewDidLoad];
/* loads xml from the web and parses the images and store it in core data(sqlite)
it uses NSFetchedController protocol for inserting cell after saving into core data
*/
[self loadFromXmlSource];
}
У меня есть 3 раздела, которые используют 3 разных прототипа ячейки в раскадровке, которую я имеюпроблема в разделе фотографий.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
Media *mediaModel = [_fetchedResultsController objectAtIndexPath:indexPath];
NSString *CellIdentifier = @"MediaCellNoImage";
if ([[mediaModel.category lowercaseString] isEqualToString:@"photos"]) {
CellIdentifier = @"MediaGalleryCell";
} else if ([[mediaModel.category lowercaseString] isEqualToString:@"videos"]) {
CellIdentifier = @"MediaCellNoImage";
} else if ([[mediaModel.category lowercaseString] isEqualToString:@"podcasts"]) {
CellIdentifier = @"MediaCell";
}
MediaGalleryCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[MediaGalleryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// I am also having a problem with image duplication so I always delete all images
if([cell.reuseIdentifier isEqualToString:@"MediaGalleryCell"]) {
for(id subview in cell.scrollView.subviews){
[subview removeFromSuperview];
}
}
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
здесь находится ячейка конфигурации, в которой я создаю поток для загрузки изображений
-(void)configureCell:(MediaGalleryCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
Media *mediaModel = [_fetchedResultsController objectAtIndexPath:indexPath];
if ([[mediaModel.category lowercaseString] isEqualToString:@"photos"]) {
NSEnumerator *e = [mediaModel.attachments objectEnumerator];
Attachment *attachment;
// iterate all images in a particular cell
while ((attachment = [e nextObject])) {
NSDictionary *objects = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
attachment.identifier, @"identifier",
attachment.thumb, @"thumb",
attachment.filename, @"filename",
cell, @"cell",
nil];
// for each image spawn a thread i am also passing the cell in order to set it there.
[NSThread detachNewThreadSelector:@selector(loadImageInScrollView:)
toTarget:self withObject:objects];
}
} else {
// code for other section
}
cell.titleLabel.text = mediaModel.title;
cell.contentLabel.text = mediaModel.content;
}
вот метод, который находится в потоке
-(void)loadImageInScrollView:(NSDictionary *)objects
{
MediaGalleryCell *cell = [objects valueForKey:@"cell"];
SBCacheFile *cacheFile = [self getCache];
NSString *finalIdentifier = [NSString stringWithFormat:@"%@_s", [objects valueForKey:@"identifier"]];
// here is where I fetched the image and cache it locally
UIImage *image = [cacheFile getCachedFileWithUrl:[objects valueForKey:@"thumb"]
withName:[objects valueForKey:@"filename"]
andStringIdentifier:finalIdentifier];
NSDictionary *obj = [[NSDictionary alloc] initWithObjectsAndKeys:
cell, @"cell",
image, @"image",
nil];
//after fetching the image I need to send it back to the main thread in order to do some UI operation
[self performSelectorOnMainThread:@selector(setImageViewForGallery:) withObject:obj waitUntilDone:YES];
}
вот последний фрагмент кода, в котором я добавляю изображение как подпредставление свойства ячейки, которое представляет собой scrollView, и воспринимает его как карусель изображений в ячейке.
-(void)setImageViewForGallery:(NSDictionary *)dictionary
{
MediaGalleryCell *cell = [dictionary valueForKey:@"cell"];
UIImage *image = [dictionary valueForKey:@"image"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
UIImageView *lastImageView =[[cell.scrollView subviews] lastObject];
if (lastImageView != nil) {
[imageView setFrame:CGRectMake((lastImageView.frame.origin.x + lastImageView.frame.size.width + 10.0f),
5.0f, 70.0f, 70.0f)];
} else {
[imageView setFrame:CGRectMake(5.0f, 5.0f, 70.0f, 70.0f)];
}
// This is where I add the imageView
[cell.scrollView addSubview:imageView];
UIImageView *lastViewForSize = [[cell.scrollView subviews] lastObject];
[cell.scrollView setContentSize:CGSizeMake(lastViewForSize.frame.origin.x + lastViewForSize.frame.size.width + 0.5,cell.scrollView.frame.size.height)];
}