我的MBProgress HUD和JSON方法 - 帮助/指导改进代码

时间:2013-11-12 09:46:34

标签: ios json mbprogresshud

我有工作代码但是如果有更好的方法或者使用我当前的方法会出现问题,我需要建议/方向。 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方法中使用viewDidLoad进行JSON调用,因为它崩溃了。登录成功后我使用popToRootViewController。只是因为有人问为什么我使用viewWillAppear进行JSON调用。如果有任何替代方案,请不要犹豫:)

2 个答案:

答案 0 :(得分:2)

  

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

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

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

答案 1 :(得分:0)

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

所以在MBProgrssHUD委托方法

中启动NSURLConnection
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

并在MBProgrssHUD委托方法

中停止NSURLConnection
- (void)connection:(NSURLConnection *)connection  didFailWithError:(NSError *)error

- (void)connectionDidFinishLoading:(NSURLConnection *)connection