Соединение не реагирует, когда устанавливается новый поток - PullRequest
0 голосов
/ 25 февраля 2010

Соединение не отвечает, если набор настроен из нового потока:

Код 1 (хорошо отвечает):

[self setConnection];
}
- (void)setConnection{
    NSLog(@"setting myConnection with request");
    myConnection = [[[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:requestURL] delegate:self] autorelease];   
}

Log 1:
2010-02-25 10:44:04.384 Untitled[1002:207] setting myConnection with request
2010-02-25 10:44:06.093 Untitled[1002:207] didReceiveResponse
2010-02-25 10:44:06.094 Untitled[1002:207] didReceiveData
2010-02-25 10:44:06.094 Untitled[1002:207] DidFinishLoading

Code 2:
[NSThread detachNewThreadSelector:@selector(setConnection) toTarget:self withObject:nil];   
}
- (void)setConnection{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"setting myConnection with request");
    myConnection = [[[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:requestURL] delegate:self] autorelease];   
    [pool release];
}

Log 2:
2010-02-25 10:40:50.280 Untitled[972:4003] setting myConnection with request


Delegates:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  { 
    NSLog(@"didReceiveResponse");
} 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  { 
    NSLog(@"didReceiveData");
}  
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"didFailWithError");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSLog(@"DidFinishLoading");
}

Почему это? Как правильно отправлять запрос и получать ответ, не останавливая основной поток / пользовательский интерфейс.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2010

Из документации NSURLConnection:

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

и

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

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

Прочтите это, чтобы узнать, как запустить цикл выполнения: http://www.depl0y.com/2009/02/20/nsurlconnection-in-its-own-thread/

Или создайте второй поток и вообще избегайте проблем с циклами выполнения, выполнив NSURLConnection sendSynchronousRequest:returningResponse:error, для которого в вызывающем потоке не требуется никакой специальной потоковой или конфигурации цикла выполнения. Не забудьте перезвонить в основной поток через performSelectorInMainThread:

1 голос
/ 25 февраля 2010

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

[[NSRunLoop currentRunLoop] run];

Вы можете увидеть это мини-туто здесь: NSURLConnection в своей собственной теме

...