How to stop UITableView from loading until data has been fetched?
I understand that UITableView
will call -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
method to get each of the cells for the table view. Say I have my data source is fetched over the internet and I have to account for latency. What will be the best way of "stopping" this method from being called? Should it block on a boolean flag in the application? Should I just call cellFor开发者_开发百科RowAtIndexPath
again from within my application?
I am uncertain as to when the function gets called, ie, how often the UITableView
"refreshes" itself. Any explanations will be helpful! Thanks!
If you don't have data, or you don't have the data for additional cells, then cellForRowAtIndex:
will not be called as long as you don't tell the UTableView that you have rowCounts or new rowCounts. That value is being set in numberOfRowsInSection:
.
In other words, don't report any new cells in numberOfRowsInSection:
, until you actually have that data in hand, and then cellForRowAtIndexPath:
won't be called prematurely.
When you do get the additional row data, then call reloadData
to get the UITableView to ask for the number of rows and then call cellForRowAtIndex:
.
If you've set UITableView
datasource and delegate from IB then it will at least go for numberOfRowsInSection
method when you push to the view, however if you're showing data from an NSArray
, it'll return count ZERO if array is still empty, so table won't go for other methods to call.
In practice, I'm pulling data from web service to feed the table, so I am not setting up the datasource and delegate from IB instead once I get the data and status OK
response I'd set the tableview.datasource = self
and tableview.delegate = self
and then call reloadData
method to update table. This ensures that it won't go for numberOfRowsInSection
method as you don't need to call it up without having the data.
What you should do is call reloadData on your table view when your data is done being fetched. That will force the table view to call it's delegate methods again for display. Those methods are called whenever the table view needs to re-display, so either when it comes into view, scrolling occurs, or you manually call reloadData.
When you invoke [tableView reloadData]
, the framework automatically invokes all the data source methods again for the table view cells that are visible currently (not for all the cells of the tableview). So the best approach would be to invoke reloadData every time you get data from the internet.
精彩评论