0

performSelectorを取得して、Webサービスコールの実行中に別のスレッドでアクティビティインジケータをロードしようとしています。問題は "return parsedData;"です。 fetchJSON:で設定されていません。しかし、getData:メソッドでparsedDataを印刷すると、正常に戻ってきます。 performSelectorがデータを取得する前に、リターンが実行されていると仮定します。 fetchJSON:メソッドがperformSelectorがparsedDataを返す前に終了するのを待つ方法はありますか?performSelector for activityIndi​​cator for webサービス - 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サービスがロードされた後にインジケータを回転させます(これは別のスレッドにある必要があると誰かが説明するまで私には決して意味がありませんでした)。 –

+0

btw、loadingViewはローディングホイールを表示するビューに設定されている変数です。クラスAがWebService変数を作成する必要がある場合は、オブジェクトをインスタンス化し、Aのビューを 'loadingView'に設定されているinitに渡します。 –