当用户按下强制更新按钮时,我在后台运行Sqlite3数据库的更新。
我想禁用该按钮,以便不锁定数据库并防止用户反复按下它。另外,我想显示活动指标。但是,该按钮不会禁用,活动指示器也不会显示。
我做错了什么?
我在加载视图时隐藏活动指示器。
使用故事板构建:
视图已加载
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//other going on
[self updateUIInterface:false];
}
更新用户界面的方法
- (void) updateUIInterface : (BOOL) updating {
if (updating) {
//Disable buttons and show activity indicator
self.actLocalDB.hidden = NO;
[self.actLocalDB startAnimating];
self.btnSyncLocal.enabled = NO;
[self.btnSyncLocal setTitle:@"Updating.." forState:UIControlStateDisabled];
[self.btnSyncLocal setUserInteractionEnabled:NO];
} else {
// Enable buttons
self.actLocalDB.hidden = YES;
[self.actLocalDB stopAnimating];
self.btnSyncLocal.enabled = YES;
[self.btnSyncLocal setTitle:@"Sync Databases" forState:UIControlStateDisabled];
[self.btnSyncLocal setUserInteractionEnabled:YES];
}
}
我更新数据库的方法
- (IBAction)syncLocalDB:(id)sender {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Begin Local DB Sync");
[self updateUIInterface:true];
//db stuff goes here
dispatch_async(dispatch_get_main_queue(), ^{
//update UI here
NSLog(@"Done updating local db");
[self updateUIInterface:false];
});
});
}
答案 0 :(得分:0)
您无法在后台线程中进行UI更改。所有UI操作都需要在主线程上执行。关于该主题,这是一个很好的blog post和一个link to the docs。
答案 1 :(得分:0)
在进入GCD-Block之前,只需调用updateUIInterface
方法。
- (IBAction)syncLocalDB:(id)sender {
[self updateUIInterface:true];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Begin Local DB Sync");
//db stuff goes here
dispatch_async(dispatch_get_main_queue(), ^{
//update UI here
NSLog(@"Done updating local db");
[self updateUIInterface:false];
});
});
}