NSRunloops и принудительная обработка событий - PullRequest
2 голосов
/ 07 апреля 2009

У меня есть несколько вкладок в приложении для iPhone, загрузка которых занимает несколько секунд (получение больших объемов данных из локальной базы данных sqlite). Когда пользователи касаются вкладок, создается впечатление, что приложение абсолютно ничего не делает. Я попытался поместить окно, показывающее счетчик вверх, но оно никогда не показывается из-за того, что обработка сразу следует.

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

Вот как выглядит мой код ...

[[ActivityIndicator sharedActivityIndicator] show];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];

По шкале от 1 до 10, насколько плохо вы оцените этот взлом?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2009

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

Есть несколько хороших подходов. Самое простое - поместить дополнительную обработку в отдельный закрытый метод, а затем сделать это:

[[ActivityIndicator sharedActivityIndicator] show];
[self performSelector:@selector(processingMethod) withObject:nil afterDelay:0];

Это приведет к тому, что processingMethod будет вызываться в конце цикла выполнения, после того, как ваш индикатор отобразится. Должно работать нормально.

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

[self performSelectorInBackground:@selector(processingMethod) withObject:nil];

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

1 голос
/ 03 мая 2009

Мой опыт показывает, что код обработки событий на iPhone не является реентерабельным. Поэтому, если вы запускаете runloop в режиме по умолчанию, будьте готовы к различным сбоям. Я обнаружил, что другие тоже имеют проблемы:

  1. http://lists.apple.com/archives/xcode-users/2009/Apr/msg00313.html
  2. http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/16246-trying-make-modal-dialog-using-nested-nsrunloop.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...