深入reloadData
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入reloadData相关的知识,希望对你有一定的参考价值。
参考技术A 1.runloop在执行任务时循环速度很快,一秒钟要循环多次,当发现没有内核mach_msg事件后,进入睡眠,每隔一分钟循环一次。2.监听reloadData完成
先来看看执行reloadData都发生了什么。
reloadData是一个异步方法,更具体点来说,是reloadData这个调用中包含了异步操作。
当我们reloadData的时候,我们本意是刷新UITableView,随后会进入一系列UITableViewDataSource和UITableViewDelegate的回调,其中有些是和reloadData同步发生的,有些则是异步发生的。
所以监听reloadData完成可以有两种方法
方法一:唤醒时刻当作reloadData完成
方法二:自定义UITableView,layoutSubviews之后当作reloadData完成(复杂,但可以更好的理解方法一)
调用的时候
通常我们在子线程任务结束后使用 dispatch_async(dispatch_get_main_queue() 来回到主线程刷新UI,那么在主线程使用它是为了什么呢?
情景:在快速滑动的时候reload
加入主队列后,会在合适的一次loop循环中进行reload操作,并且在这次loop中渲染cell,实现流畅的滑动。
而没有加入主队列的reload,渲染cell的时机不固定。一般发生跳屏、白屏,就是因为需要等到tableView停下才会继续渲染cell。
参考链接:
ios 事件处理机制与图像渲染过程
为啥我无法运行 reloadData?
【中文标题】为啥我无法运行 reloadData?【英文标题】:Why am I not able to run reloadData?为什么我无法运行 reloadData? 【发布时间】:2012-03-21 17:39:04 【问题描述】:这是UIViewController
。我想在我的表格视图上运行reloadData
,但它不起作用。
首先,我从另一个角度调用fromGenre:
。我开始NSURLConnection
。然后它调用connectionDidFinishLoading:
。然后doParse:
。之后,在这个函数中,我想调用reloadData
。但它没有运行。
- (void)viewDidLoad
[super viewDidLoad];
//Parse function
-(void)doParse
NSString *jsonString = [[NSString alloc]initWithData:result encoding:NSUTF8StringEncoding];
data2=[[[[jsonString JSONValue]] objectForKey:@"feed"] objectForKey:@"entry"];
trackGenre = [[NSMutableArray alloc]init];
for (NSDictionary *dic in data2)
NSString *artistName = [[dic objectForKey:@"im:artist"]objectForKey:@"label"];
NSMutableDictionary *dicData = [NSMutableDictionary dictionary];
[dicData setValue:artistName forKey:@"artist"];
[trackGenre addObject:dicData];
**//[self.aTableView reloadData];
/*
[ self.aTableView performSelectorOnMainThread:@selector( reloadTableView )
withObject:nil
waitUntilDone:YES
];*/
[self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:YES];
//[self reloadTableView];**
-(void)reloadTableView
[[[self view] aTableView] reloadData];
NSLog(@"do reload");
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
//[self doParse];
[self performSelectorOnMainThread:@selector(doParse) withObject:nil waitUntilDone:YES];
-(void)fromGenre:(NSURLRequest *)urlRequest
NSLog(@"urlRequest:%@",urlRequest);
aConnection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return trackGenre ? [trackGenre count]:100;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"second_VC_Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.textLabel.text = [[trackGenre objectAtIndex:indexPath.row]objectForKey:@"track"];
return cell;
@end
【问题讨论】:
你的问题真的不清楚...你能更好地解释你的问题是什么吗? 我的问题是我该怎么做才能重新加载tableView。就是这样。 不应该将reloadData
调用到self.aTableView
,而不是[[self view] aTableView]
?所以[self.aTableView reloadData]
do reload
消息打印出来了吗?如果是您没有正确引用表格视图。如果不是你有线程问题。
我描述了错误的命令。我已经正确运行 [self.aTableView reloadData] 或 [aTableView reloadData]。但这也不起作用。(“重新加载”消息也打印出来。)我尝试将 [NSLog] 写入 [cellForRowAtIndexPath:] 和 [tableView numberOfRowsInSection:]。 [tableView numberOfRowsInSection:] 已被调用。然而,[CellForRowAtIndexPath:] 似乎没有被调用。
【参考方案1】:
您应该尝试使用调试器。 [[self view] aTableView]
似乎是引用表格视图的一种奇怪方式。如果它是控制器的属性,则应使用self.aTableView
,如果是常规实例变量,则应仅使用aTableView
。
-(void)reloadTableView
[aTableView reloadData];
NSLog(@"do reload");
【讨论】:
我描述了错误的命令。我已经正确地编写了 [self.aTableView reloadData] 或 [aTableView reloadData]。但这也不起作用。【参考方案2】:所以.. reload 被调用.. 然后按照 erik 的建议做并使用调试器:) ppl 往往使用得不够多:P 在重新加载之前设置一个断点并查看变量:
po 流派跟踪
po一个TableView
po aTableView.dataSource
【讨论】:
以上是关于深入reloadData的主要内容,如果未能解决你的问题,请参考以下文章