2012-06-01 3 views
2

Привет Я использую SQllite в своем приложении. В этом я хочу показать индикатор активности во время запуска и завершения процесса.Индикатор активности не работает

Вот мой код:

[activityIndicator startAnimating]; 
// DB Open 

// DB close 
// DB process ends 
[activityIndicator stopAnimating]; 

Когда я пытаюсь это, Ее не работает должным образом. Блокирует ли sqlite-код анимацию индикатора? Я использую индикатор активности в scrollview.

+0

Вы делаете это из основной темы? – epatel

ответ

3

объяснение, почему он не работает просто: интерфейс только обновляется после текущего runloop имеет прекращается. Runloop охватывает все вызовы, которые вы делаете в одном потоке (в настоящее время - основной поток вашего приложения).

Так, например, если вы вызываете что-то вроде for (int i=1; i<1000; i++) { label.text = i } (в грубом псевдокоде), ваша метка не будет отображать 1000 изменений текста, она отобразит только окончательное значение.

Это сделано с помощью UIKit, так что интерфейс может быть плавным и без зазубрин.

Если вы действительно хотите выполнить несколько обновлений в пользовательском интерфейсе в том же методе, вам необходимо выполнить вычисления в фоновом потоке. В других ответах упоминается использование отложенного вызова (0,1 секунды), но это бесполезно, и он генерирует огромные задержки, если вы вызываете это повторно, скажем, сто раз. Правильное решение заключается в следующем:

- (void)doSomethingVeryLong 
{ 
    [spinner startAnimating]; 
    // or [SVProgressHud showWithMessage:@"Working"]; 
    [self performSelectorInBackground:@selector(processStuffInBackground)]; 
} 

- (void)processStuffInBackground 
{ 
    for (int i = 0; i < 1e9; i++) 
    { 
     /* Make huge computations, 
     * wait for a server, 
     * teach a neurasthenic French (no offence, I'm French) 
     */ 
    } 
    [self performSelectorOnMainThread:@selector(workDone)]; 
} 

- (void)workDone 
{ 
    [spinner startAnimating]; 
    // or [SVProgressHud dismiss]; 
} 

Если вы хотите возиться с техническим материалом, гляньте на нить руководство по программированию или ссылку NSRunloop.

+0

Thanx Cyrille для отличного объяснения .... – Swapnil

+0

Обратите внимание, что в зависимости от ваших настроек потоковой SQLite (см. Http : //www.sqlite.org/threadsafe.html), используя это конкретное решение (performSelectorInBackground :) для этой проблемы, возможно, не очень хорошая идея. –

0

Попробуйте вызвать часть процесса после задержки в несколько секунд.

[activityIndicator startAnimating]; 

// вызвать эту часть после задержки в другом методе (БД Open)

// DB close 
// DB process ends 
[activityIndicator stopAnimating]; 

Это будет работать.

+1

Thanx Miteh ... его работа !!! – Swapnil

+0

Вы не должны блокировать основной поток, рассмотрите обработку всех связанных с БД вещей в фоновом потоке – beefon

4

попытка ниже код:

[[activityIndicator startAnimating]; 
[self performSelector:@selector(DB_process) withObject:nil afterDelay:0.1]; 

создать DB метод процесс

- (void)DB_process 
{ 
    // DB close 
    // DB process ends 
    [activityIndicator stopAnimating]; 

} 
+0

Спасибо !!!! Это сработало для меня – user1489709

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