0

performSelector를 사용하여 웹 서비스 호출이 진행되는 동안 별도의 스레드에서 활동 표시기를로드하려고합니다. 문제는 "return parsedData;"입니다. fetchJSON :에 설정되지 않았습니다. 그러나 getData : 메서드에서 parsedData를 인쇄하면 다시 정상적으로 돌아옵니다. performSelector가 데이터를 가져 오기 전에 반환이 실행되고 있다고 가정합니다. fetchJSON : 어떤 방법으로 performSelector가 parsedData를 반환하기 전에 완료 될 때까지 기다릴 수 있습니까?performSelector with activityIndicator for web service - IOS

-(void)showActivityIndicator 
{ 
    CGRect frame = CGRectMake(0.0, 0.0, 125.0, 125.0); 
    loading = [[UIActivityIndicatorView alloc] initWithFrame:frame]; 
    [loading setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    [loading hidesWhenStopped]; 
    //loading.center=[self tableView].center; 
    [loading startAnimating]; 
    [loading sizeToFit]; 
    loading.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | 
           UIViewAutoresizingFlexibleRightMargin | 
           UIViewAutoresizingFlexibleTopMargin | 
           UIViewAutoresizingFlexibleBottomMargin); 

    // initing the bar button 
    //UIBarButtonItem *loadingView = [[UIBarButtonItem alloc] initWithCustomView:loading]; 
    //loadingView.target = self; 

    [loadingView addSubview:loading]; 
} 


- (NSDictionary *)fetchJSON:(NSString *)urlString 
{ 
    NSMutableString *domain = [[NSMutableString alloc] initWithString:@"http://www.blablabla.com/dev/"]; 
    [domain appendString:urlString]; 
    //NSLog(@"%@", domain); 
    NSURL *url = [NSURL URLWithString:domain]; 
    NSURLRequest *req = [NSURLRequest requestWithURL:url]; 

    [self showActivityIndicator]; 
    [self performSelector:@selector(getData:) withObject:req afterDelay:0.0]; 
    //[self performSelectorOnMainThread:@selector(getData:) withObject:req waitUntilDone:YES]; 

    return parsedData; 
} 

-(IBAction)getData:(id)sender 
{ 
    NSURLResponse* response = nil; 
    NSData *data = [NSURLConnection sendSynchronousRequest:sender returningResponse:&response error:nil]; 
    parsedData = [NSJSONSerialization 
        JSONObjectWithData:data 
        options:NSJSONReadingMutableLeaves 
        error:nil]; 
    NSLog(@"GET DATA %@", parsedData); 
    [loading stopAnimating]; 
    loading = nil; 
} 

답변

0

"performSelector 별도의 스레드의 활동을 지표로드"??

UIKit은 일반적으로 스레드로부터 안전하지 않습니다.

주석 처리 된 코드와 혼동을 일으키는 메서드 선언 사이 (getData : IBAction이 코드 내에서 및 컨트롤의 동작 모두에서 호출되는 이유는 무엇입니까?), 여기에서 수행하려는 작업에 대한 컨텍스트가 정말 없습니다. .

달성하려는 목표와이 코드가 그 그림에 어울리는 지에 대한 상위 수준 개요를 제공하는 것부터 시작할 수 있습니까?

+0

죄송합니다. 이러한 모든 메서드는 내 WebService 클래스에 있습니다. 다른 클래스는이 클래스를 인스턴스화하고 URL 경로 문자열을 fetchJSON에 전달하고 웹 서비스 데이터를 가져옵니다. 이것은 작업 표시기를 통합하기로 결정할 때까지 (로드 시간은 다소 시간이 걸릴 수 있기 때문에) 내 응용 프로그램에서 잘 작동했습니다. 이건 정말 악몽이었고, 내가 가진 가장 가까운 것은 그것을 이렇게 구현하는 것이 었습니다. 내가 사용한 다른 많은 메소드는 웹 서비스가로드 된 후 표시기가 회전하게 만들 것이다. (누군가가 별도의 스레드에 있어야한다고 설명 할 때까지는 나에게 전혀 이해가되지 않았다.) –

+0

btw, loadingView는 로딩 휠을 표시하려는 뷰에 설정된 변수입니다. 그래서 클래스 A가 WebService 변수를 생성 할 필요가 있다면 객체를 인스턴스화 한 다음 A의 뷰를 'loadingView'로 설정된 init에 전달합니다. –