2012-07-23 2 views
0

iOS 앱 UI를 새로 고치는 방법에 문제가 있습니다. 데이터가되면 웹 서비스 (하지 메인 스레드) iOS의 다른 스레드에서 UI 구성 요소에 액세스

  • 별도의 스레드에서 호출해야
  • 웹 서비스에서 검색 한 데이터를 기반으로 jQuery과의

    1. 데이터 표시 : 내가 달성하고 싶어하는 것은 이것이다 검색된 데이터와 함께 UITableView의 내용을 새로 고칩니다.
    2. 잘못된 네트워크 연결에서 웹 서비스의 데이터를 수신하는 동안 UI가 멈추지 않거나 앱이 사용자 입력을 차단하지 않기 때문입니다

    는이를 위해, 나는 다음과 같은 소스 코드를 만들 :

    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
        NSURL *myURL = [[NSURL alloc] initWithString:[Constant webserviceURL]]; 
        NSURLRequest *request = [NSURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData      timeoutInterval:60]; 
        [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    } 
    
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 
        [self myparser] = [[MyXMLParser alloc] initXMLParser]; 
    
        [parser setDelegate:myparser]; 
        BOOL success = [parser parse]; 
        if (success) { 
         // show XML data to UITableView 
         [_tableView performSelectorOnMainThread:@selector(reloadData) withObject:[myparser xmldata] waitUntilDone:NO]; 
        } 
        else { 
         NSLog(@"Error parsing XML from web service"); 
        } 
    } 
    

    ================== 내 구현이 맞습니까? 아무도 그것을 해결하는 방법을 알아?

  • 답변

    0

    데이터가 아래로 당기거나이 문제는 URL에서 데이터를 다운로드는 핸들러 블록을 호출했을 때 당신은 그런 다음 다른 스레드에서 데이터를 얻기 위해 전화를 할 것입니다

    + (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler 
    

    를 호출 할 것이다 동일한 스레드에 원래 호출이 이루어졌습니다.

    여기에 그것을 사용하는 방법 중 하나입니다 : https://stackoverflow.com/a/9409737/1540822

    또한

    - (id)initWithRequest:(NSURLRequest *)request delegate:(id <NSURLConnectionDelegate>)delegate 
    

    을 사용할 수 있습니다 그리고 데이터 척에 다운로드 될 때이 당신의 NSURLConnectionDelegate 방법 중 하나를 호출합니다. 큰 데이터를 가지면 응답에 너무 많은 시간을 소비하지 않도록이 값을 사용할 수 있습니다.

    +0

    안녕하세요, 응답 해 주셔서 감사합니다. 하지만 다른 스레드 (메인 스레드가 아닌)가 UITableView 객체에 액세스하여 UI 자체를 새로 고치는 방법을 알고 있습니까? – ekychandra

    +0

    tableview에는 업데이트해야하는 인덱스 집합이 있으며 사용자가 화면에서 볼 수있는 인덱스를 해결해야 할 때 셀이 화면에서 벗어나거나 화면의 해당 셀에 대한 인덱스를 업데이트 할 때까지 기다려야합니다. [self performSelector : @selector (doReloadTableData) withObject : NULL afterDelay : 0.0];을 호출해야합니다. – Pareshkumar

    +0

    또는 performSelector : onThread : withObject : waitUntilDone :을 사용하고 onThread : parm의 MainThread를 넘겨 줄 수 있습니다. 첫 번째 옵션은 다른 호출에서 랩핑해야하거나 데이터를 가져올 때 main에서 performSelection을 수행하는 것입니다. ------- 지금하고있는 것과 같습니다 : [_tableView performSelectorOnMainThread : @selector (reloadData) withObject : [myparser xmldata] waitUntilDone : NO]; – Pareshkumar

    관련 문제