цель c - асинхронный http-запрос блокирует программу - PullRequest
2 голосов
/ 27 декабря 2011

У меня очень странная проблема с асинхронным http-запросом:

Я отправляю запрос на сервер, который задерживает его на 10 секунд, а затем отправляет ответ.

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

это основной поток:

self.MessagesList=[[MessagesArray alloc] init];
[NSThread detachNewThreadSelector:@selector(backgroundMethod) toTarget:self withObject:nil];

-(void)backgroundMethod
{       
    [self.MessagesList updateFromServer];  
      CFRunLoopRun();        //the method dies without this line  
}

и это запрос:

-(void)updateFromServer{
    NSLog(@"method called");
    responseData = [NSMutableData data];
    NSURLRequest *request =
    [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]];
    NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request     delegate:self];
    if(!connection) {
        NSLog(@"connection failed :(");
    } else {
        NSLog(@"connection succeeded  :)"); 
    }
}

, а responseData определяется следующим образом:

@property (nonatomic,strong) NSMutableData *responseData;

Я также попытался выполнить executeSelectorInBackground вместо NSThread и даже вызвать updateFromServer без какого-либо из нихи результаты были одинаковыми.

Я работаю с ARC - может быть, это как-то связано с этим?

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

спасибо

1 Ответ

1 голос
/ 24 февраля 2014

Нет необходимости использовать какие-либо потоки с асинхронным запросом. Просто убедитесь, что у вас есть делегат со всеми необходимыми методами делегата.

Вызывать runloop опасно - если вы задаете вопросы здесь вместо ответа, не вызывайте CFRunLoopRun ()

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

ARC не имеет к этому никакого отношения. ARC - это не то, что таинственным образом останавливает работу http-соединений.

...