Какао Touch начать команду ПОСЛЕ viewDidLoad - PullRequest
0 голосов
/ 18 сентября 2011

У меня есть приложение, в котором мне необходимо подключиться к Интернету после загрузки представления.Однако, если я помещу этот код в метод viewDidLoad, родительское представление замораживается, а затем размораживается после подключения к новому представлению.Тем не менее, я хотел бы, чтобы новый вид загрузился в первую очередь, а затем запустил соединение.Я попытался использовать viewDidAppear:, однако я получаю ту же проблему.

Кроме того, продолжит ли воспроизводиться какая-либо анимация во время соединения?Будет ли интерфейс реагировать?Если нет, то многопоточность - путь?

Вот мой код:

-(void)viewDidLoad {
    [super viewDidLoad];
    //Do some other view initialization
    //Connect is a class I use to connect to the internet
    [Connect getData:someString];
}

Когда я помещаю код в viewDidAppear, происходит то же самое.

Код подключения:

NSMutableURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    NSHTTPURLResponse *response;
    NSError *error;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

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

Ответы [ 4 ]

1 голос
/ 18 сентября 2011

Как следует из названия метода, представление уже загружено при выполнении viewDidLoad.

Как правило, обязательно используйте асинхронные соединения для подключения к Интернету.Никогда не блокируйте основной поток.

0 голосов
/ 19 сентября 2011

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

0 голосов
/ 19 сентября 2011

Вы заметите, что viewDidLoad метод документация из UIViewController сообщает:

... Вызывается после загрузки представления контроллера в память.

Это не обязательно означает, что он вызывается после того, как представление отображается на экране.

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

И, что касается последнего вопроса, - это многопоточностьидти? Как уже говорили другие, самый простой и, вероятно, самый популярный способ справиться с этим - инициализировать NSURLConnection с initWithRequest:delegate:.Делегатом является ваш класс UIViewController или Connect или любой другой класс, который вы хотите соответствовать протоколу NSURLConnectionDelegate и использовать методы NSURLConnectionDelegate для обработки загруженных данных.NSURLConnection выполнит работу асинхронно и освободит основной поток для обработки анимаций, отображения пользовательского интерфейса и т. Д.

0 голосов
/ 18 сентября 2011

это проще, чем вы думаете.

Все, что вам нужно, это управление потоками. На вид сделал Do:

[NSThread detachNewThreadSelector:@selector(yourMethod:) toTarget:yourTarget withObject:yourObject];

и позже в другой части сделайте:

- (void)yourMethod:(id)sender{
//download the info but do not update the GUI

[self performSelectorOnMainThread:@selector(updatingTheGUI:) withObject:yourObject waitUntilDone:NO]


}

- (void)updatingTheGUI:(id)sender{
//Update your GUI

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...