Использование сна в приложениях iPhone (особенно.с UINavigationController)

StackOverflow https://stackoverflow.com/questions/1042479

Вопрос

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

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

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

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

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

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

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

Ваше здоровье,

Алан.

Это было полезно?

Решение

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

Пример:

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top