我想在用户按下刷新按钮并刷新表视图后用活动指示器替换刷新按钮,我想将其更改回刷新按钮。但是当我按下刷新按钮时,它并没有变为活动指示器,而是刷新按钮被突出显示,直到数据重新加载完成。
代码如下。我错过了什么吗?
-(void) reloadNewsStarted{
UIActivityIndicatorView *activityIndicatorRightBarItem = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[activityIndicatorRightBarItem startAnimating];
UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicatorRightBarItem];
[activityIndicatorRightBarItem release];
self.navigationItem.rightBarButtonItem = activityItem;
[activityItem release];
[self reloadNewsEnded];
}
-(void) reloadNewsEnded {
//reload data process
UIBarButtonItem *reloadNewsBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reloadNewsStarted)];
reloadNewsBtn.style = UIBarButtonItemStyleBordered;
self.navigationItem.rightBarButtonItem = reloadNewsBtn;
[reloadNewsBtn release]; }
代替写作
[self reloadNewsEnded];
请写信
[NSThread detachNewThreadSelector:@selector(reloadNewsEnded) toTarget:self withObject:nil];
此行在后台启动新线程,因此活动指示器和数据重新加载将在两个线程中同时完成。
为什么此行在reloadNewStarted
方法的末尾
[self reloadNewsEnded];
它似乎只是撤消了对按钮的更改?您应该等到操作完成后再调用它
直到运行循环重新获得代码的控制权后,更改按钮才能生效。听起来您的重新加载操作是同步的,并且阻止了事件队列,这将不允许这种情况发生。如果您的处理花费大量时间,则需要在主运行循环上使用后台线程或异步处理(例如,通过使用NSURLConnection来管理网络任务和回调),这样就不会阻塞。