我有一个简单的应用,可以在用户输入UISearchBar
时以XML格式下载搜索结果。下载+解析是线程化的,一旦完成,它会触发NSNotification
告诉ViewController,表视图为[tableView reloadData];
以下是在结果出现时收到通知的代码:
- (void)receivedResults:(id)notification {
results = [notification object];
DLog(@"Received %i results",[results count]);
[[self tableView] reloadData];
}
我得到日志输出“Received 4 results”,但是表格视图不会重新加载数据,直到我滚动/拖动几个像素。我正在使用内置的UITableViewCellStyleSubtitle
单元格样式,并且我不会改变高度或使用表格视图看中任何东西。
我做错了什么?
答案 0 :(得分:65)
我能够得到同样的工作。但问题是需要在主线程上调用重载数据。
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
我认为这比performSelectorOnMainThread选项更实用
答案 1 :(得分:34)
致电
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
而不是
[self.tableview reloadData]
答案 2 :(得分:4)
我的问题是我从后台线程发布了NSNotification。要避免这种情况,只需将postNotificationMethod包装在dispatch_async方法中,如下所示:
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"FinishedDownloading" object:result];
});
收到此通知后,将在主线程上调用tableView.reloadData
。
答案 3 :(得分:0)
我有同样的问题,我已经尝试了我可以在谷歌上找到的所有解决方案。但所有这些都不起作用。
最后我发现我在viewDidLoad之前添加了观察者,然后[self.tableView reloadData]无效。
首先,我在根导航视图控制器的viewDidLoad中调用setObserverForUserInfoDatabase。因为我认为它早先被称为。功能是这样的:
- (void)setObserverForUserInfoDatabase:(NSString *)name {
[[NSNotificationCenter defaultCenter] addObserverForName:name
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
[self loadUserInfo];
[self.tableView reloadData];
NSLog(@"User Panel Notification \n %@", self);
}];}
然后我将代码移动到viewController本身的viewDidLoad中。
- (void)viewDidLoad {
NSLog(@"View Did Load");
[super viewDidLoad];
[self setObserverForUserInfoDatabase:UserInfoDataBaseAvailabilityNotification];
}
然后一切正常。
我还不知道原因。如果有人知道请告诉我。
答案 4 :(得分:0)
重新加载 tableView
viewWillLayoutSubviews