0

Webサービスの呼び出しが行われている間に、performSelectorにアクティビティインジケーターを別のスレッドにロードさせようとしています。問題は「returnparsedData;」です。fetchJSON:に設定されていません。ただし、getData:メソッドでparsedDataを出力すると、正常に戻ります。PerformSelectorがデータの取得を完了する前に、リターンが実行されていると想定しています。fetchJSON:メソッドがparsedDataを返す前にperformSelectorが終了するのを待つ方法はありますか?

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

1 に答える 1

0

「performSelectorを実行して、アクティビティインジケーターを別のスレッドにロードします」

??

UIKitは、一般的にスレッドセーフではありません。

コメントアウトされたコードと紛らわしいメソッド宣言(getData:IBActionはなぜですか?コード内とコントロールのアクションの両方から呼び出されるのですか?)の間に、ここで何をしようとしているのかについてのコンテキストが本当に欠けています。

まず、達成しようとしていることの概要と、このコードがその図にどのように適合するかについて説明しますか?

于 2012-02-02T01:17:45.140 に答える