Pytanie dotyczące próbki LazyTableImages firmy Apple - nie zachowuje się dokładnie tak, jak w app store

Mam UITableView z listą elementów, z których każdy ma własny obraz. Myślałem, że przykładowy projekt LazyTableImages firmy Apple będzie idealny do nauki i wykorzystania do implementacji tego samego rodzaju procesu pobierania obrazów asynchronicznie, po pobraniu oryginalnych danych listy.

W większości przypadków działa to całkiem dobrze, z tym wyjątkiem, że zauważyłem subtelną różnicę w zachowaniu, między tą przykładową aplikacją, a tym, jak rzeczywisty app store pobiera obrazy.

Jeśli Uruchom próbkę LazyTableImages, a następnie wykonaj szybki ruch-przewiń w dół, zobaczysz, że obrazy nie zostaną wyświetlone, dopóki Po przewijanie zostanie całkowicie zatrzymane.

Teraz, jeśli wykonasz ten sam test z listą elementów w Rzeczywistym app store, zobaczysz, że obrazy zaczynają się wyświetlać, gdy tylko pojawią się nowe elementy, nawet jeśli przewijanie jeszcze się nie zatrzymało.

Staram się osiągnąć te same wyniki, ale jak na razie nie robię żadnych postępów. Czy ktoś masz jakiś pomysł jak to zrobić?

Dzięki!

Author: bpatrick100, 2011-02-11

2 answers

Jestem zdumiony, że nikt nie mógł na to odpowiedzieć...

W końcu zorientowałem się, jak osiągnąć dokładnie ten sam efekt, który jest używany w Rzeczywistym app store, w odniesieniu do tego, jak ikony są pobierane/wyświetlane.

Weź przykładowy projekt LazyTableImages i wykonaj kilka uproszczonych modyfikacji.

  1. Przejdź do kontrolera widoku głównego i usuń wszystkie kontrole dotyczące przewijania tabeli i / lub zwalniania w cellForRowAtIndexPath

  2. Usuń wszystkie wywołania loadImagesForOnScreenRows, a tym samym usuń również tę metodę.

  3. Przejdź do IconDownload.m I zmienić metodę startDownload na , a nie zrobić asynchroniczny obraz w dół, ale zamiast tego zrobić pobieranie synchronizacji w wątku tła. Usuń Cały kod w startDownload i dodaj następujący kod, aby wyglądał tak:


- (void)startDownload
{
    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage) object:nil];

    [queue addOperation:operation];

    [operation release];
    [queue release];
}

Następnie dodaj loadImage, jak to:


- (void)loadImage
{
    NSData *imageData = [[NSData alloc] initWithContents OfURL:[NSURL URLWithString:appRecord.imageURLString]];
    self.apprecord.appIcon = [UIImage imageWithData:imageData];
    [imageData release];

    [self performSelectorOnMainThread:@selector(notifyMainThread) withObject:nil waitUntilDone:NO];
}

Następnie dodaj notifyMainThread like this:


- (void)notifyMainThread
{
    [delegate appImageDidLoad:self.indexPathInTableView];
}

Zrobione! Uruchom go, a zobaczysz dokładne zachowanie sklepu app store, nie będzie już czekania na pobieranie obrazów do momentu zatrzymania przewijania i nie będzie już czekania na wyświetlanie obrazów do momentu zatrzymania przewijania lub do momentu usunięcia palca z ekranu.

Obrazy są pobierane, gdy tylko komórka jest gotowa do wyświetlenia, a obraz jest wyświetlany, gdy tylko zostanie pobrany, kropka.

Przepraszam za literówki, nie wklejałem tego z mojego aplikacja, wpisałem to, ponieważ jestem z dala od mojego Maca teraz...

Mam nadzieję, że to wam pomoże...
 10
Author: bpatrick100,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-17 16:47:52

Sprawdź UIScrollViewDelegate . Zaimplementowałem coś takiego, odsłuchując scrollViewDidScroll:, obliczając prędkość przewijania (sprawdzając contentOffset w stosunku do ostatnio zarejestrowanego contentOffset, podzielonego przez różnicę czasu) i zaczynając ładować obrazy, gdy prędkość spadnie poniżej określonego progu. (Możesz również osiągnąć coś podobnego za pomocą uiscrollviewdelegate ' s scrollViewDidEndDragging:willDecelerate:).

Oczywiście nie musisz sprawdzać prędkości, możesz po prostu załadować obrazy na UITableViewDelegate ' s tableView:willDisplayCell:forRowAtIndexPath: za każdym razem, gdy widzisz nową komórkę, ale odkryłem, że jeśli użytkownik przegląda Tony komórek, nie musisz się martwić, dopóki nie zobaczysz, że spowolnią przeglądanie.

 0
Author: kevboh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-11 01:25:07