好的,所以我有这段代码:
- (void) searchBarSearchButtonClicked:(UISearchBar *)aSearchBar
{
[_activity startAnimating];
[self.searchBar bringSubviewToFront:_activity];
[self.searchBar resignFirstResponder];
if([_activity isAnimating]){
NSLog(@"its animating!");
}
dispatch_queue_t background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(background, ^{
[self performSelectorOnMainThread:@selector(filter:) withObject:aSearchBar.text waitUntilDone:YES];
dispatch_async(dispatch_get_main_queue(), ^{
[_activity stopAnimating];
if(![_activity isAnimating]){
NSLog(@"its not animating anymore!");
}
[self.tableView reloadData];
});
});
}
我想要做的是启动一个活动指示器,我将它作为子视图添加到搜索栏。在这段代码中,我在主线程上启动动画(记录测试),然后设置一个后台异步线程,该线程运行生成将重新加载 tableview 的新数据集的方法。我等待它返回,在哪一点,我停止动画并在主线程上重新加载 tableview。
结果是这样的……当应用程序运行时,我转到表格视图,然后在搜索栏中输入一个词。当我按下回车键时,活动指示器出现,表格加载,活动指示器停止。这很棒。
然后,我再次单击搜索栏,开始新的搜索,只是这一次,活动指示器没有显示自己,但 NSLog 显示它正在动画。表视图按预期重新加载,但 UI 上没有活动指示器,但基于 NSLog,它似乎工作。
最后,如果我等待大约一分钟,然后再次搜索,它工作正常。我怀疑的是后台线程可能没有完成,而主线程继续做它需要做的事情。
老实说,我已经打了两天的头,有人能解释我做错了什么吗?