performSelectorを取得して、Webサービスコールの実行中に別のスレッドでアクティビティインジケータをロードしようとしています。問題は "return parsedData;"です。 fetchJSON:で設定されていません。しかし、getData:メソッドでparsedDataを印刷すると、正常に戻ってきます。 performSelectorがデータを取得する前に、リターンが実行されていると仮定します。 fetchJSON:メソッドがperformSelectorがparsedDataを返す前に終了するのを待つ方法はありますか?performSelector for activityIndicator 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;
}
申し訳ありませんが、これらのメソッドはすべて私のWebServiceクラスにあります。他のクラスはこのクラスをインスタンス化し、URLパス文字列をfetchJSONに渡してWebサービスデータを取得します。これは、アクティビティインジケータを組み込むことを決定するまで(ロード時間に時間がかかることがあるため)、私のアプリケーションでうまくいきました。これは本当に悪夢であり、私が得た最も近いのはこのように実装することでした。私が使用した他の多くのメソッドは、Webサービスがロードされた後にインジケータを回転させます(これは別のスレッドにある必要があると誰かが説明するまで私には決して意味がありませんでした)。 –
btw、loadingViewはローディングホイールを表示するビューに設定されている変数です。クラスAがWebService変数を作成する必要がある場合は、オブジェクトをインスタンス化し、Aのビューを 'loadingView'に設定されているinitに渡します。 –