2013-07-02 3 views
1

Я пытаюсь запустить -getHTMLupdate в фоновом режиме, но он не работает.Запуск фонового потока не работает

-viewDidLoad

- (void)viewDidLoad { 
    UIImage *navBarImage = [[UIImage imageNamed:@"menubar.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 15, 5, 15)];//Navbar 
    [[UINavigationBar appearance] setBackgroundImage:navBarImage forBarMetrics:UIBarMetricsDefault]; 

    [self performSelectorInBackground:@selector(getHTMLupdate) withObject:nil]; 
} 

Вот -getHTMLupdate

-(void) getHTMLupdate { 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    /* set headers, etc. on request if needed */ 
    [request setURL:[NSURL URLWithString:@"http://appstarme.com/GD/GDHTMLPARSINGINFORMATION.php"]]; 
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL]; 
    NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSScanner *scanner = [NSScanner scannerWithString:html]; 
    NSString *token = nil; 
    [scanner scanUpToString:@"<h1>" intoString:NULL]; 
    [scanner scanUpToString:@"</h1>" intoString:&token]; 

    NSLog(@"DATA : %@", html); 

    _updateFromUser.text = html; 

Вот вывод консоли

2013-07-02 20:26:25.775 Social App[8130:3707] DATA : 
Please check out the new Skype contest at www.Skype.com 
2013-07-02 20:26:25.776 Social App[8130:3707] bool _WebTryThreadLock(bool), 0x1e8ab970: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now... 
1 0x3a021259 WebThreadLock 
2 0x36083185 <redacted> 
3 0xc75fd -[homeChannel getHTMLupdate] 
4 0x349e7231 <redacted> 
5 0x3c2170e1 <redacted> 
6 0x3c216fa8 thread_start 

NSLog странно возвращает правильные данные, но приложение по-прежнему падает

EDIT

Добавлено это в конце кода

[_updateFromUser performSelectorOnMainThread: @selector(setText:) 
          withObject: html 
         waitUntilDone: FALSE]; 

работал отлично.

+0

Вы не должны менять какие-либо элементы интерфейса вне основной темы! В последней строке вы получаетеHTMLupdate, что вы делаете, это проблема? –

ответ

2

Вы врезаться, потому что вы пытаетесь обновить пользовательский интерфейс в фоновом потоке с этим вызовом:

_updateFromUser.text = html; 

Я хотел бы предложить усиливая NSURLConnectionDataDelegate и обновить пользовательский интерфейс, когда connection:didReceiveData: метод срабатывает ...

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSScanner *scanner = [NSScanner scannerWithString:html]; 
    NSString *token = nil; 
    [scanner scanUpToString:@"<h1>" intoString:NULL]; 
    [scanner scanUpToString:@"</h1>" intoString:&token]; 

    NSLog(@"DATA : %@", html); 

    _updateFromUser.text = html; 
} 

Apple Docs Here

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

EDIT2: Я испортил ... У меня был делегат неправильно ... Забыл, какой из них устарел в iOS5. Используйте NSURLConnectionDataDelegate. Был рассмотрен ответ выше.

+0

Я пытался использовать - (void) подключение: (NSURLConnection *) подключение сделалReceiveData: (NSData *) данные { NSLog (@ "получил данные"); } но он никогда ничего не возвращал – IamGretar

+0

Вы добавили делегата в ваш .h-файл? – Dan

+0

Отредактированный делегат ... Моя ошибка. Использовать NSURLConnectionDataDelegate – Dan

Смежные вопросы