2009-06-25 2 views
1

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

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

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

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

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

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

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

Cheers,

Alan.

ответ

3

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

Пример:

[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f]; 
+0

Спасибо! Это сработало отлично. После получения данных из основного поиска я нажимаю waitController (interstitial), а затем с помощью функции performSelector с задержкой вызывается метод в appDelegate, который загружает результаты. – alan

0

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

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

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

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

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

+0

Спасибо за это. Я рассмотрю NSOperation. Хотя в этом случае моя обработка вызова веб-службы не является проблемой. Я пытаюсь воспроизвести эффект, который я получаю при вызове веб-службы при создании межстраничной страницы при выполнении собственного поиска. Приветствия. – alan

+0

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

+0

Определенно согласен, хотя я использую performSelector, как было предложено выше, которое я предполагаю просто задерживает действие, а не спящий поток. (И да, NSOperation меня пугает;) Приветствия. – alan