UIActivityIndicatorView не отображается во время работы - PullRequest
0 голосов
/ 30 ноября 2011

Я внес изменения в базу данных в следующей версии моего приложения.

С конца viewDidLoad контроллера основного представления я вызываю метод, который проверяет, актуальна ли база данных. Если это не так, UIActivityIndicatorView отображается во время восстановления базы данных (занимает 5-10 секунд).

Эта часть выглядит так:

[self.view addSubview: activityView];

//repair database
...
//done

[activityView removeFromSuperview];

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

Проблема в том, что все это происходит во время экрана загрузки (default.png).

Я добавил некоторые записи в журнал, чтобы увидеть, когда вызывается ActivityView, когда база данных обновляется и т. Д., И могу подтвердить, что все это регистрируется во время экрана загрузки.

Что я должен сделать, чтобы решить эту проблему?

1 Ответ

2 голосов
/ 30 ноября 2011

Проблема в том, что вы пытаетесь выполнить всю эту работу в главном потоке. Пользовательский интерфейс фактически не обновляется, пока управление не вернется к циклу выполнения. Вместо этого вам нужно отобразить индикатор активности, а затем запланировать работу базы данных в фоновом потоке. Убедитесь, что ввод интерфейса отключен в течение этого времени. После завершения работы вы можете перезвонить в главный поток, удалить индикатор активности и включить взаимодействие с пользовательским интерфейсом.

Обратите внимание, что если вы сделаете это, вам нужно убедиться, что работа с вашей базой данных выполнена таким образом, чтобы это происходило в фоновом потоке (например, если вы используете CoreData, вашему фоновому потоку нужен собственный контекст и т. Д. )

Также обратите внимание, что если вы решите не делать этого и вместо этого просто будете использовать отображение default.png, ваше приложение будет фактически остановлено, если для выполнения этой работы потребуется более 5-10 секунд, а пользователь никогда не сможет успешно запустить его.

...