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];

}

该应用程序的架构如下:

首页-->登录-->注册

因此我不能在 JSON 调用的 Home 方法中使用 viewDidLoad,因为它会崩溃。我popToRootViewController在成功登录时使用。以防有人问我为什么使用 viewWillAppear 进行 JSON 调用。如果有任何替代方案,请毫不犹豫地提出建议:)

4

2 回答 2

2

这是一个同步任务,因为我需要信息来修改屏幕上的标签。

这不是一个好的借口。如果您在主线程上运行同步网络代码,则会阻塞 UI 并且用户界面会挂起。

viewDidLoad中,使用适合显示内容正在加载的任何用户界面设置视图层次结构。然后,当您的 JSON 完成加载时,更新用户界面以显示内容。

于 2013-11-12T10:07:36.143 回答
0

你正在使用NSURLConnection所以它的简单方法是

所以从MBProgrssHUD委托NSURLConnection方法开始

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

MBProgrssHUD并在NSURLConnection委托方法中停止

- (void)connection:(NSURLConnection *)connection  didFailWithError:(NSError *)error

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
于 2013-11-12T10:10:56.827 回答