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 は奇妙に正しいデータを返しますが、アプリは引き続きクラッシュします

編集

これをコードの最後に追加しました

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

完璧に機能しました。

4

1 に答える 1

2

この呼び出しでバックグラウンド スレッドで UI を更新しようとしているため、クラッシュしています。

_updateFromUser.text = html;

を活用して、メソッドが起動NSURLConnectionDataDelegateしたときに UI を更新することをお勧めします...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 ドキュメントはこちら

編集:sendAsynchronousRequestバックグラウンド スレッドの生成を気にせず、意図したとおりにデリゲート メソッドを利用するために、リクエストを に変更することもお勧めします。

EDIT2: 私は台無しにしました...デリゲートが間違っていました... iOS5で廃止されたものを忘れました。を使用しNSURLConnectionDataDelegateます。上記の回答は対処済みです。

于 2013-07-02T20:57:47.230 に答える