0

好的,所以我有这段代码:

- (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,它似乎工作。

最后,如果我等待大约一分钟,然后再次搜索,它工作正常。我怀疑的是后台线程可能没有完成,而主线程继续做它需要做的事情。

老实说,我已经打了两天的头,有人能解释我做错了什么吗?

4

1 回答 1

0

这有可能与视图层次结构有关,具体取决于您将其添加UIActivityIndicatorView到的位置。如果您将它直接添加到搜索栏,它可能会以您不期望的方式重新组织子视图(并将活动指示器移到其中一些后面,阻止它可见,即使它正在制作动画。)

一个不错的选择可能是将搜索栏嵌入工具栏中,然后将活动指示器放在左侧(或右侧),并用灵活的空间将其与搜索栏分开。

于 2014-05-28T20:58:18.610 回答