2013-11-12 1 views
0

У меня есть рабочий код, но мне нужен совет/направление, если есть лучший подход или возникнут проблемы с использованием моего текущего подхода. MBProgressHUD запускается в viewDidLoad, тогда у меня есть метод JSON, который отправляет и получает ответ. Это синхронная задача, потому что мне нужна информация для изменения меток на экране. В конце метода JSON вызывается остановка MBProgressHUD.Мой подход MBProgress HUD и JSON - помощь/руководство по улучшению кода

Мои viewDidLoad:

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


    //start loading 
    MBProgressHUD * hud = [MBProgressHUD showHUDAddedTo: self.view animated:YES] ; 
    hud.labelText [email protected]"Loading Information"; 
    [email protected]"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 в методе Home для вызова JSON, потому что он сбой. При успешном входе в систему я использую popToRootViewController. Просто спросите кого спросить, почему я использую viewWillAppear для вызова JSON. Если есть альтернативы, не стесняйтесь предлагать :)

+0

Сделайте это асинхронным. Никогда, НИКОГДА не блокируйте пользовательский интерфейс. Представьте, что вы представляете это представление с помощью контроллера навигации, загрузка занимает слишком много времени, и пользователь хочет вернуться к предыдущему виду. С вашей логикой это будет невозможно, и пользователь будет вынужден оставаться в этом представлении до тех пор, пока сетевая выборка не завершится. –

+0

@ Спасибо, я сделаю асинч. Я не обратил на это внимания. – DevC

+1

Как предложение, в объективе C является хорошей практикой в ​​операторах «if» для проверки недействительности, поскольку ваш «if (jsonData! = Nil)» записывает их как: «if (jsonData)» –

ответ

2

Это синхронная задача, потому что мне нужна информация для изменения меток на экране.

Это не хорошее оправдание. Если вы запускаете синхронный сетевой код в основном потоке, вы блокируете интерфейс и пользовательский интерфейс зависает.

В viewDidLoad настройте иерархию своего представления с помощью любого пользовательского интерфейса, чтобы показать, что содержимое загружается. Затем, когда ваш JSON завершит загрузку, обновите пользовательский интерфейс, чтобы показать содержимое.

+0

Спасибо, отмечено! Я делаю асинч. Советуете ли вы скрыть элементы экрана (которые обновлены JSON) до завершения JSON? – DevC

+1

Это зависит от контекста. Просто делайте то, что имеет смысл с точки зрения пользователя. – Jim

0

Вы используете NSURLConnection так это просто подход

Так начните MBProgrssHUD в методе NSURLConnection делегат

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

и остановить MBProgrssHUD в методе NSURLConnection делегат

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

и

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
Смежные вопросы