UI未在后台线程上更新

时间:2015-01-21 14:59:00

标签: ios objective-c multithreading user-interface uiactivityindicatorview

当用户按下强制更新按钮时,我在后台运行Sqlite3数据库的更新。

我想禁用该按钮,以便不锁定数据库并防止用户反复按下它。另外,我想显示活动指标。但是,该按钮不会禁用,活动指示器也不会显示。

我做错了什么?

我在加载视图时隐藏活动指示器。

使用故事板构建:

enter image description here

视图已加载

- (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];

        });

    });

}

2 个答案:

答案 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];

        });

    });

}