Использование сна в приложениях для iPhone (особенно с UINavigationController) - PullRequest
1 голос
/ 25 июня 2009

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

Несмотря на то, что при выполнении симулятора с использованием ОК (в режиме реального времени) поиск, основанный на вызове веб-службы, занимал больше времени, чем я рассчитывал, работая на телефоне. Эти вызовы выглядят намного хуже по сравнению с собственными поисками, которые являются мгновенными. Чтобы уменьшить относительную разницу, я хотел вставить поддельную вставку (страница с индикатором активности) для собственных поисков (поиски веб-службы уже используют один), но у меня возникла проблема с синхронизацией нажатий контроллера навигации при объединении с сна (п).

Во всяком случае, раздел поиска моего приложения - это navController с вкладкой tabController. При попытке использовать код, подобный этому:

[[tabBarController.viewControllers objectAtIndex:0] pushViewController:(UIViewController *)waitingController animated:YES];
sleep(2);

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

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

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

Приветствия

Алан.

Ответы [ 2 ]

3 голосов
/ 25 июня 2009

sleep(float) блокирует основной поток, вызывая зависание пользовательского интерфейса. Вместо этого вы должны запланировать некоторые действия, которые будут выполнены позже, используя -[NSObject performSelector:withObject:afterDelay:]

Пример:

[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f];
0 голосов
/ 25 июня 2009

Я бы посмотрел на изменение вашей архитектуры и не спал в основном потоке - не лучший пользовательский опыт!

Изучите использование NSOperation для управления вашими взаимодействиями с веб-службой - это позволит вам ставить операции в очередь и запускать их в определенной последовательности или параллельно.

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

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

NB. Мне понадобилось несколько раз, чтобы по-настоящему разобраться с NSOperation и NSOperationQueue, но затраченное мной время определенно стоило того.

...