This is my first try into iPhone development and I have some UITableViewControllers 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 UITableViewControllers 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.