iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   UITableViewController, grote dataset en lazy loading (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/52122-uitableviewcontroller-grote-dataset-lazy-loading.html)

Kokeshi 16-01-10 00:21

UITableViewController, grote dataset en lazy loading
 
Beste Allemaal,

Ik ben nieuw met iPhone development, maar heb een redelijk grote programmeerervaring voor niet Mac systemen. Zelf heb ik goed gegoogled en mij al sufgelezen in verschillende IPhone SDK boeken en gekeken naar iPhone cursussen als de Stanford iPhone Programming cursus. Alleen zijn voorbeelden daar altijd speelvoorbeelden en zijn niet wat ik zoek. Ik hoop dat jullie mij kunnen helpen.

Ik ben bezig met een applicatie waarin ik ruim 10.000 items in een lijst wil kunnen tonen. Gegevens over de 10.000 items staan opgeslagen in een SQLite database. De items toon ik in een lijst.

De voorbeelden uit de boeken werken zo:
1. lees alle records uit de database in een NSMutableArray *itemList
2. In de tableView:cellForRowAtIndexPath: method hergebruik je de TableViewCell en als die er niet is maak je een nieuwe aan
3. vul de cell.textLabel.text met de waardes die je wil laten zien

Dit werkt prima, behalve dat je 10.000 records in je geheugen hebt gelezen en dit niet geheugen efficient is. Stel dat dit 20.000 records worden of meer. De Stanford cursus zegt dat je 'Lazy Loading' moet gebruiken. Oftewel alleen die data binnenhalen als dat nodig is.

Kortom dan zou ik het denk ik zo moeten oplossen:
1. lees een aantal records in uit de database. Zeg 20 stuks.
2. Scroll je in de TableView met 10 regels richting het einde, lees dan nieuwe gegevens in en laat die zien in de Tableview
3. Scroll je terug in de TableView en dreig je tegen het begin te lopen, lees dan weer nieuwe data uit de database.

Geen enkel voorbeeld laat zien hoe ik dat moet doen. Kan iemand mij hier op weg helpen? Heeft iemand dit al eerder gedaan?

Alvast bedankt voor jullie suggesties!

Whacko 18-01-10 16:39

Hoi Kokeshi,

Ik geloof dat er een example op de developer website staat. Maar ik zal je toch even uitleggen hoe je het kunt doen.

De UITableView is al redelijk geoptimaliseerd. Dat wil zeggen, hij zal alleen informatie vragen voor de rows die op dat moment op het scherm zijn.

Voor elke cell die dus op het scherm is, krijg je dus een event binnen:

- (UITableViewCell *)tableView:(UITableView *) tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {

je kan dan met indexPath.section en indexPath.row uitvinden welk record ie wil hebben. Dit moet je dus op een of andere manier mappen naar bijvoorbeeld de keys van je data in de database.


Misschien is het trouwens een idee om naar CoreData te kijken, ik geloof dat daar goede integratie is en het voor een groot deel al voor je gedaan wordt.

wubbe 19-01-10 11:18

10.000 rijen in een tabel???
 
Als je zulke grote hoeveelheden data wilt laten zien, moet je je altijd afvragen of dat wel makkelijk in het gebruik is.
Gaat de gebruiker echt door die 10.000 rijen scrollen?? Nee dus.

Je moet dus een soort indexering gaan toepassen, en daar ligt al een deel van de oplossing van je probleem.

Effe uitleggen: stel je hebt een indexering op alfabet en de gebruiker selecteert de 'P' dan haal je alleen alle rijen op die met een 'P' beginnen, lazy dus.
Ook dat kun je in SQLite database optimaliseren door bv. een hulp-kolom te maken waar alleen de eerste letter in staat (alles kleine letters). Daar zet je een index op, en die kolom gebruik je in je WHERE clause.

Kokeshi 19-01-10 14:53

@Whacko: bedankt voor je tip! rows en sections staan niet bij de Class descriptions, maar zijn een uitbreiding.

@wubbe: ben het met je eens dat je de gebruiker dit niet voor wilt schotelen. Ik heb ook andere ingangen ingebouwd hoe je tot de data komt, maar ik wil wel de mogelijkheid hebben dat de lijst ook gewoon doorzocht kan worden met een soort van aantal filtermogelijkheden bovenaan. De suggestie die jij daarvoor doet, lijkt me daarvoor prima werken. Dank!


Alle tijden zijn GMT +2. Het is nu 11:34.