Wkrótce mam NSDictionary
z adresami URL obrazów, które muszę pokazać w moim UITableView
. Każda komórka ma tytuł i obraz. Udało mi się to zrobić, chociaż przewijanie było opóźnione, ponieważ wydawało się, że komórki pobierają swój obraz za każdym razem, gdy pojawią się na ekranie. Szukałem trochę i znalazłem SDWebImage
na github. To spowodowało, że opóźnienie przewijania zniknęło. Nie jestem do końca pewien, co to było, ale wierzyłem, że to trochę buforowało. Ale! Za każdym razem, gdy otwieram aplikację po raz pierwszy, nie widzę żadnych obrazów i muszę przewinąć w dół i utworzyć kopię zapasową, aby mogły zostać dostarczone. A jeśli wyjdę z aplikacji z przyciskiem głównym i znowu się otworzę, wydaje się, że działa buforowanie, ponieważ obrazy na ekranie są widoczne, ale jeśli przewińę jedną komórkę w dół, następna komórka nie ma obrazu. Do momentu przewinięcia obok i kopii zapasowej lub kliknięcia. Czy tak powinno działać buforowanie? Lub jaki jest najlepszy sposób buforowania obrazów pobranych z Internetu? Obrazy są aktualizowane na bieżąco, więc byłem blisko, aby je zaimportować do projektu, ale lubię mieć możliwość aktualizowania zdjęć bez przesyłania aktualizacji ..Najlepszy sposób na buforowanie obrazów w aplikacji ios?
Czy nie jest możliwe załadowanie wszystkich zdjęć do całości tableview tworzy pamięć podręczną (biorąc pod uwagę, że coś jest w pamięci podręcznej) podczas uruchamiania? Czy dlatego czasami widzę komórki bez obrazów?
I tak, ciężko mi zrozumieć, czym jest pamięć podręczna.
--EDIT--
Próbowałem to tylko obrazy o tym samym rozmiarze (500x150), a aspekt błędów nie ma, jednak kiedy przewijać w górę lub w dół, tam są zdjęcia na wszystko komórki, ale na początku są w błędzie. Po wyświetleniu komórki przez kilka milisekund pojawi się odpowiedni obraz. Jest to niezwykle denerwujące, ale może tak musi być? .. Wygląda na to, że najpierw wybiera niewłaściwy indeks z pamięci podręcznej. Jeśli przewijam powoli, to widzę, że obrazy migają od niewłaściwego obrazu do prawidłowego. Jeśli przewijam szybko, to uważam, że błędne obrazy są widoczne przez cały czas, ale nie mogę stwierdzić z powodu szybkiego przewijania. Gdy szybkie przewijanie spowalnia i w końcu się zatrzymuje, niepoprawne obrazy nadal pojawiają się, ale natychmiast po zatrzymaniu przewijania aktualizuje się do właściwych obrazów. Mam również niestandardową klasę UITableViewCell
, ale nie wprowadziłem żadnych dużych zmian ... Jeszcze nie przeszedłem przez mój kod, ale nie mogę wymyślić co może być nie tak ... Może mam coś w niewłaściwy porządek .. mam zaprogramowane dużo w Java, C#, PHP itp, ale mam trudności ze zrozumieniem Objective-C, ze wszystkimi .h
i .m
... mam też `
@interface FirstViewController : UITableViewController{
/**/
NSCache *_imageCache;
}
(między innymi zmiennymi) w FirstViewController.h
. Czy to nie jest poprawne? Jest to mój .
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"hallo";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSMutableArray *marr = [hallo objectAtIndex:indexPath.section];
NSDictionary *dict = [marr objectAtIndex:indexPath.row];
NSString* imageName = [dict objectForKey:@"Image"];
//NSLog(@"url: %@", imageURL);
UIImage *image = [_imageCache objectForKey:imageName];
if(image)
{
cell.imageView.image = image;
}
else
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString* imageURLString = [NSString stringWithFormat:@"example.com/%@", imageName];
NSURL *imageURL = [NSURL URLWithString:imageURLString];
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];
if(image)
{
dispatch_async(dispatch_get_main_queue(), ^{
CustomCell *cell =(CustomCell*)[self.tableView cellForRowAtIndexPath:indexPath];
if(cell)
{
cell.imageView.image = image;
}
});
[_imageCache setObject:image forKey:imageName];
}
});
}
cell.textLabel.text = [dict objectForKey:@"Name"];
return cell;
}
Czy możesz opublikować swój kod w 'cellRowRowAtIndexPath' i cokolwiek innego, co może być istotne tutaj? Buforowanie polega tylko na przechowywaniu czegoś, co powinno być potrzebne, aby uzyskać dostęp ponownie w łatwiej dostępnym miejscu, aby przyspieszyć późniejszy dostęp. W tym przypadku buforowanie oznacza, że aplikacja powinna przechowywać dane obrazu dla każdej komórki po pobraniu go po raz pierwszy, a następnie po prostu ponownie użyć go w dowolnym momencie, gdy wyświetlana jest konkretna komórka (co SDWebImage powinno robić dla ty). – Dima
Gotowe. Wyłączyłem SDWebImage, ale wciąż otrzymuję dziwne wyniki. Czasami wyświetlany jest zły obraz podczas przewijania. – Sti
Po prostu zainicjuj 'cell.imageView.image' tuż przed tym pierwszym' dispatch_async'. – Rob