0

Я запускаю обновление базы данных Sqlite3 в фоновом режиме, когда пользователь нажимает кнопку обновления силы.UI не обновляется на фоновом потоке

Я хочу отключить кнопку, чтобы не блокировать базу данных и не нажимать ее снова и снова. Кроме того, я хочу показать индикатор активности. Однако кнопка не отключается, и индикатор активности не отображается.

Что я делаю неправильно?

Скрыть индикатор активности, когда изображение загружено.

Построенный с раскадровки:

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

     }); 

    }); 

} 
+4

Вы не можете обновить представление из фоновой темы. Переместите 'updateUIInterface' из dispatch_async. – gabuh

+0

Хороший лорд. Вот и все. Примите один взнос. –

ответ

0

Вы не можете вносить изменения пользовательского интерфейса в фоновых потоков. Все операции пользовательского интерфейса должны выполняться в основном потоке. Вот хороший blog post по теме и link to the docs.

0

Просто позвоните updateUIInterface Метод перед входом в GCD-блок.

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

     }); 

    }); 

} 
Смежные вопросы