0

作業コードはありますが、より良いアプローチがある場合、または現在のアプローチを使用して問題が発生する場合は、アドバイス/指示が必要です。MBProgressHUD は viewDidLoad で始まります。その後、応答をポストして受信する JSON メソッドがあります。画面上のラベルを変更するための情報が必要なため、これは同期タスクです。JSON メソッドの最後に、MBProgressHUD を停止するための呼び出しがあります。

私のviewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];
    //some code missing


    //start loading
    MBProgressHUD * hud = [MBProgressHUD showHUDAddedTo: self.view animated:YES] ;
    hud.labelText =@"Loading Information";
    hud.detailsLabelText=@"Please wait.";
    hud.dimBackground = YES;

}

私のviewDidAppear

-(void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:YES];
    [self getJSON];
}

私のgetJSON方法:

-(void) JSON{

    //post
    NSMutableString * postString = [NSMutableString stringWithString:homeUrl];
    [postString appendString:[NSString stringWithFormat:@"?%@=%@",@"email",self.email]];
    [postString appendString:[NSString stringWithFormat:@"&%@=%@",@"pass",self.pass]];
    NSMutableURLRequest * request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:postString]];
    [request setHTTPMethod:@"POST"];
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

    //get response
    NSString * requestST = [[request URL] absoluteString];
    NSData * jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:requestST]];
    NSError *error;

    //added check
    if (jsonData!=nil) {

       NSDictionary * dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];

       self.status = [dataDictionary objectForKey:@"status"];
       self.balance = [dataDictionary objectForKey:@"result"];



       //check status
        if ([self.status isEqualToString:@"fail"]) {
       NSLog(@"Fail")
        }
    else{
        //assign variables
    }

}
//if JSON is NIL
else{
    NSLog(@"JSON Data is NIL");

}

//finish loading
[MBProgressHUD hideAllHUDsForView:self.view animated:YES];

}

アプリのアーキテクチャは次のとおりです。

HOME-->ログイン-->会員登録

したがって、クラッシュするため、JSON 呼び出しの Home メソッドで viewDidLoad を使用できません。popToRootViewControllerログインが成功したときに使用します。なぜ私が JSON 呼び出しに viewWillAppear を使用するのかと尋ねられる場合に備えて。代替案があれば、遠慮なく提案してください:)

4

2 に答える 2

2

画面上のラベルを変更するための情報が必要なため、これは同期タスクです。

それは良い言い訳ではありません。メイン スレッドで同期ネットワーク コードを実行すると、UI がブロックされ、ユーザー インターフェイスがハングします。

viewDidLoad、コンテンツがロードされていることを示すのに適したユーザー インターフェイスを使用して、ビュー階層を設定します。次に、JSON の読み込みが完了したら、ユーザー インターフェイスを更新してコンテンツを表示します。

于 2013-11-12T10:07:36.143 に答える