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;
}
죄송합니다. 이러한 모든 메서드는 내 WebService 클래스에 있습니다. 다른 클래스는이 클래스를 인스턴스화하고 URL 경로 문자열을 fetchJSON에 전달하고 웹 서비스 데이터를 가져옵니다. 이것은 작업 표시기를 통합하기로 결정할 때까지 (로드 시간은 다소 시간이 걸릴 수 있기 때문에) 내 응용 프로그램에서 잘 작동했습니다. 이건 정말 악몽이었고, 내가 가진 가장 가까운 것은 그것을 이렇게 구현하는 것이 었습니다. 내가 사용한 다른 많은 메소드는 웹 서비스가로드 된 후 표시기가 회전하게 만들 것이다. (누군가가 별도의 스레드에 있어야한다고 설명 할 때까지는 나에게 전혀 이해가되지 않았다.) –
btw, loadingView는 로딩 휠을 표시하려는 뷰에 설정된 변수입니다. 그래서 클래스 A가 WebService 변수를 생성 할 필요가 있다면 객체를 인스턴스화 한 다음 A의 뷰를 'loadingView'로 설정된 init에 전달합니다. –