Мой подход MBProgress HUD и JSON - помощь / руководство по улучшению кода
У меня есть рабочий код, но мне нужен совет / направление, если есть лучший подход или возникнут проблемы с использованием моего текущего подхода. 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];
}
Архитектура приложения следующая:
ГЛАВНАЯ -> Вход -> Регистрация
Поэтому я не могу использовать viewDidLoad в методе Home для вызова JSON, потому что он дает сбой. Я использую popToRootViewController
когда есть успешный вход в систему. Просто попросите кого-нибудь спросить, почему я использую viewWillAppear для вызова JSON. Если есть какие-либо альтернативы, не стесняйтесь предлагать:)
2 ответа
Это синхронная задача, потому что мне нужна информация для изменения меток на экране.
Это не очень хорошее оправдание. Если вы запускаете синхронный сетевой код в главном потоке, вы блокируете пользовательский интерфейс и пользовательский интерфейс зависает.
В viewDidLoad
настройте иерархию представлений с любым подходящим пользовательским интерфейсом, чтобы показать, что контент загружается. Затем, когда ваш JSON завершит загрузку, обновите пользовательский интерфейс, чтобы показать содержимое.
Ты используешь NSURLConnection
так что простой подход
Итак начнем MBProgrssHUD
в NSURLConnection
метод делегата
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
и остановиться MBProgrssHUD
в NSURLConnection
метод делегата
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
а также
- (void)connectionDidFinishLoading:(NSURLConnection *)connection