This is my first try into iPhone development and I have some UITableViewController
s which will show the data returned from a webservice.
In my AppDelegate I have setup a timer which is called every few seconds and reloads the model. I keep the same object reference and just refresh it's contents, so I have the same object on any UITableViewController
that is visible at the moment.
When the data is refreshed on the AppDelegate, I call:
[[(UITableViewController *)[self.navigationController topViewController] tableView] reloadData];
The model is basically a collection of file
objects. Each file
object has some properties and flags.
This works quite well if the current UITableViewController
is a simple table, with one section, that maps each cell to a sequential index on the Array of files
.
But I have one of the UITableViewController
s that shows this file
details and, depending on a flag on the file
object, will show 2 or 3 sections. I've put this logic here:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if ([[_file status] intValue] & DOWNLOADING) {
kIndexTransferSpeed = 1;
kIndexSettings = 2;
return 3;
} else {
kIndexSettings = 1;
kIndexTransferSpeed = -1;
return 2;
}
}
So on this controller, my -tableView:cellForRowAtIndexPath:
is just a big if
statement that will show a property from the _file
object, depending on the indexPath
.
The problem with this approach is that when this table is reloading on the device, I can actually see it being reloaded. The section titles flash for a moment and the cells take a bit to show up. Specially if I am scrolling the table while it's reloaded.
I've read somewhere that I should keep myself from putting any logic on those UITableViewController
methods. But what should I do?
I thought about having a specific method that will create a "data view model" with the data ready to be consumed by - tableView:cellForRowAtIndexPath:
and would be called by the AppDelegate before calling it's [tableView reloadData]. But I'd have to recreate this whole "view model" everytime it's called, since it's the same object and I don't really know what has been changed on the data model.