2

iOSアプリでサーバーと通信しています。アラートビューを開く次の方法があります。アプリがサーバーから応答を取得している間、読み込み中のビューを表示したい。

- (void) showDetailedQuestion:(id)sender
{
       //loading view                  
        self.loading_alert = [[UIAlertView alloc] initWithTitle:@"Loading\nPlease Wait..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
        [self.loading_alert show];

        UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

        // Adjust the indicator so it is up a few pixels from the bottom of the alert
        indicator.center = CGPointMake(loading_alert.bounds.size.width / 2, loading_alert.bounds.size.height - 50);
        [indicator startAnimating];
        [self.loading_alert addSubview:indicator];

    UIButton *btn = (UIButton*)sender;
    int indx = btn.tag;

    NSLog(@"tag:%d",indx);
    answerAnQuestion *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Answer"];

    vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal ;
    vc.que_id = [self.que_id valueForKey:[NSString stringWithFormat:@"%d",indx]];
    vc.qid_list = self.que_id;
    vc.crnt = indx;

    [self presentViewController:vc animated:YES completion:nil];
    [self.loading_alert dismissWithClickedButtonIndex:0 animated:YES];
}

そして別のanswerAnQuestion.mで

- (void)viewDidLoad
{
            NSString *address = [NSString stringWithFormat:@"%@%@%@%@%@%@%@", path,@"questions/",que_id,@"?token=",token,@"&user_id=",usrId];
    NSURL *URL = [NSURL URLWithString:address];
    NSLog(@"%@",address);

    [NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[URL host]];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL cachePolicy:NSURLCacheStorageAllowedInMemoryOnly
                                                       timeoutInterval:60.0];
    [request setHTTPMethod:@"GET"];
    responseData = [[NSMutableData alloc] init];

    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

    if (data) 
    {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*) response;
        //If you need the response, you can use it here
        int statuscode = [httpResponse statusCode];
        NSString *responseMsg = [NSHTTPURLResponse localizedStringForStatusCode:statuscode];
        NSLog(@" Status code: %d",statuscode );
        NSLog(@" Status msg: %@",responseMsg );

    }
    else 
    {
        // Handle error by looking at response and/or error values
        NSLog(@"%@",error);
    }
}

私の問題は、ビューが変更されているときにアラートビューが一瞬だけ表示されることです。ボタンをクリックすると開くはずです。その理由は何ですか?これを解決するには?

編集1:

サーバーに非同期リクエストを行うと、それらのデータをテーブルビューに設定できません。同期リクエストを送信する場合にのみ、これらのデータをテーブルビューに設定できますが、アプリをブロックします。なぜこれが起こっているのですか?

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

0

私はNuzhat Zariコードを扱ってきました。彼に感謝しますが、ネストされた「sendAsynchronousRequest」間のコアデータ操作でいくつかの問題が発生しました(奇妙なスレッドとメモリエラーが発生する)ので、私の解決策は「への呼び出しをネスト解除することでした。 sendAsynchronousRequest」を使用し、いくつかのメイン スレッド変数の検証を使用します。

@interface myMainThreadClass
@property (nonatomic,assign) NSInteger *currentAsyncTasks;
@end
@implementation

// Use init or viewDidLoad to make "currentAsyncTasks=0"!!

-(void)method
{
[self showLoadingAlert]; //or some ui update function

currentAsyncTasks++;
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
    //do something with data
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self dismissAlertInFinalTask] 
    });
}];
 currentAsyncTasks++;
[NSURLConnection sendAsynchronousRequest:urlRequest2 queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
    //do something with data 
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self dismissAlertInFinalTask] 
    });
}];

 currentAsyncTasks++;
[NSURLConnection sendAsynchronousRequest:urlRequest3 queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

   //do something with data 
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self dismissAlertInFinalTask] 
    });
}];
}
-(void)dismissAlertInFinalTask
{
    currentNetworkTasks--;
    if (currentNetworkTasks == 0)
    {
        [self dismissLoadingAlert];//or some ui update function;
    }
}
@end

また、誰かが NSURLConnection デリゲート NSURLConnectionDataDelegate と ui 呼び出しを使用して複数のリクエストを実行できたかどうかも知りたいです。

于 2013-11-25T05:52:55.553 に答える