调用web服务IOS时使用activityIndicator的performSelector的问题



我正试图让performSelector在进行web服务调用时在一个单独的线程上加载活动指示器。问题是在fetchJSON:中没有设置"return parsedData;"。然而,当我在getData:方法中打印parsedData时,它会很好地返回。我假设返回是在performSelector完成获取数据之前执行的。有没有办法让fetchJSON:方法等待performSelector完成后再返回parsedData?

-(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;
}

"performSelector在单独的线程上加载活动指示器"

UIKit通常不是线程安全的。

在注释掉的代码和令人困惑的方法声明之间(为什么getData:是一个IBAction?它是从代码内部调用的还是作为控件的操作调用的?),我真的缺少您在这里尝试做什么的上下文。

你能不能先从高层概述一下你正在努力实现的目标,以及这些代码是如何融入这幅图的?

相关内容

  • 没有找到相关文章

最新更新