2012-03-29 16 views
2

処理スレッドとメインスレッドの両方でHUDのラベルを変更する最も良い方法は何ですか?複数のディスパッチでMBProgressHUDを使用

[activitySpinner startAnimating]; 
    //[HUD setLabelText:@"Connecting"]; 
    //[HUD showUsingAnimation:YES]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
     hud.labelText = @"Connecting1"; 

     NSString *url = [NSString stringWithFormat:@"my URL", [dataObj.pListData objectForKey:@"API_BASE_URL"], userField.text, passwordField.text]; 
     NSLog(@"Login: %@",url); 
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 

     NSError *error;   
     NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
     [HUD setLabelText:@"Processing"]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if ([json objectForKey:@"authToken"] != nil) { 
       [HUD setLabelText:@"Logging In"]; 
       NSLog(@"Found authtoken %@", [json objectForKey:@"authToken"]); 
       [dataObj setAuthToken:[json objectForKey:@"authToken"]]; 
       [dataObj setLocationId:[json objectForKey:@"c_id"]]; 

       [dataObj setStaffId:[[json objectForKey:@"staffOrRoomsId"] integerValue]]; 
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
       [HUD setLabelText:@"Downloading"]; 

       }); 

       [self getAllData]; 
       [self performSegueWithIdentifier:@"segueToRootController" sender:self]; 


      } else { 
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:[json objectForKey:@"friendlyErrors"] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
       [alert show]; 
       alert = nil; 
      } 
      [MBProgressHUD hideHUDForView:self.view animated:YES]; 
     }); 


     [activitySpinner stopAnimating]; 
    }); 

メインスレッドでラベルを変更して実行すると、すべての処理が完了するまで変更されないため、上記を試しました。

viewWillAppearで、私はそれは、接続が表示されますが、処理またはダウンロードが表示されません

HUD = [[MBProgressHUD alloc] initWithView:self.view]; 
    [self.view addSubview:HUD]; 
    HUD.delegate = self; 

を設定しています。

答えて

0

すべてのすべてで、あなたは(私の頭の上から書かれた)このような何かを試してみてください。エミュレータには表示されません。私はそれがコンピュータプロセッサを使用しているので、それは速く起こると思います。

1

のObjective-Cは大​​文字と小文字が区別されますので、あなたはここで2件のMBProgressHUDインスタンスがあります。

  • HUDビューに追加するよりも、[[MBProgressHUD alloc] initWithView:self.view];で作成するが、(それが最初に隠されています)を示すために失敗
  • あなたがビューに追加し、作成して、すぐにこれは本質的にHUDが隠れていることを意味コンビニエンスコンストラクタ[MBProgressHUD showHUDAddedTo:self.view animated:YES];

を示しhud (ProcessingとDownload)は表示されず、hudが表示され、それに設定した唯一のテキスト(Connecting1)が表示されます。

コードにエラーがあり、バックグラウンドスレッドでビュー(hud MBProgressHUDインスタンス)を作成する必要があります。一般的な経験則では、メインスレッドでのみビューを変更することです。 MBProgressHUDはあなたのスレッドの安全を確保するためにここでKVOトリッキーを行うので、ここで注目すべき点は例外ではありません。

さらに、上記のエラーを修正した場合でも、テキストを「ログイン」(またはアラートを表示)に設定し、すぐにHUDを非表示にするシナリオがあることに注意してください。このテキストは非常に簡単に表示されます。ダウンロードが完了したら、おそらくHUDを隠すことはできません。 activitySpinnerにも同様の問題があります。私はそれが実際に表示処理とダウンロードを行うことがわかったデバイス上でこれをテストした後、実際

[activitySpinner startAnimating]; 
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
hud.labelText = @"Connecting1"; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    NSString *url = [NSString stringWithFormat:@"my URL", [dataObj.pListData objectForKey:@"API_BASE_URL"], userField.text, passwordField.text]; 
    NSLog(@"Login: %@",url); 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 

    NSError *error;   
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
    [hud setLabelText:@"Processing"]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if ([json objectForKey:@"authToken"] != nil) { 
      [hud setLabelText:@"Logging In"]; 
      NSLog(@"Found authtoken %@", [json objectForKey:@"authToken"]); 
      [dataObj setAuthToken:[json objectForKey:@"authToken"]]; 
      [dataObj setLocationId:[json objectForKey:@"c_id"]]; 

      [dataObj setStaffId:[[json objectForKey:@"staffOrRoomsId"] integerValue]]; 
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
       [HUD setLabelText:@"Downloading"]; 
       // Download synchronosly here? 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        [MBProgressHUD hideHUDForView:self.view animated:YES]; 
        [activitySpinner stopAnimating]; 
       }); 
      }); 

      [self getAllData]; 
      [self performSegueWithIdentifier:@"segueToRootController" sender:self]; 
     } else { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:[json objectForKey:@"friendlyErrors"] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
      [alert show]; 
      alert = nil; 
      [MBProgressHUD hideHUDForView:self.view animated:YES]; 
      [activitySpinner stopAnimating]; 
     } 
    }); 
}); 
+0

ありがとうございます、私はスレッドに作成されていないことを確認します。私はこのポストからコードを修正しましたので、私は確信します。 – Bot

関連する問題