0
我試圖讓performSelector在Web服務調用時在單獨的線程上加載活動指示器。問題是「返回parsedData;」沒有在fetchJSON中設置:但是,當我在getData:方法中打印parsedData時,它恢復得很好。我假設在performSelector完成獲取數據之前正在執行返回。有沒有辦法讓fetchJSON:方法在返回parsedData之前等待performSelector完成?在調用web服務時使用performSelector for activityIndicator的問題 - 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並獲取我的Web服務數據。這對我的應用程序工作正常,直到我決定合併活動指示符(因爲加載時間可能需要一些時間)。這確實是一場噩夢,而我得到的最接近的就是通過這種方式實施它。我使用的很多其他方法會導致指示器在加載Web服務後旋轉(在有人解釋它需要位於單獨的線程中之前,這對我來說永遠不會有意義)。 – 2012-02-02 09:57:23
順便說一句,loadingView是一個變量設置爲視圖,我想顯示加載輪。所以如果A類需要創建一個WebService變量,它將實例化該對象,然後將A的視圖傳遞給init,該init被設置爲'loadingView'。 – 2012-02-02 09:59:35