0

我試圖讓performSelector在Web服務調用時在單獨的線程上加載活動指示器。問題是「返回parsedData;」沒有在fetchJSON中設置:但是,當我在getData:方法中打印parsedData時,它恢復得很好。我假設在performSelector完成獲取數據之前正在執行返回。有沒有辦法讓fetchJSON:方法在返回parsedData之前等待performSelector完成?在調用web服務時使用performSelector for activityIndi​​cator的問題 - 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並獲取我的Web服務數據。這對我的應用程序工作正常,直到我決定合併活動指示符(因爲加載時間可能需要一些時間)。這確實是一場噩夢,而我得到的最接近的就是通過這種方式實施它。我使用的很多其他方法會導致指示器在加載Web服務後旋轉(在有人解釋它需要位於單獨的線程中之前,這對我來說永遠不會有意義)。 – 2012-02-02 09:57:23

+0

順便說一句,loadingView是一個變量設置爲視圖,我想顯示加載輪。所以如果A類需要創建一個WebService變量,它將實例化該對象,然後將A的視圖傳遞給init,該init被設置爲'loadingView'。 – 2012-02-02 09:59:35

相關問題