У меня есть рабочий код, но мне нужен совет/направление, если есть лучший подход или возникнут проблемы с использованием моего текущего подхода. 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. Если есть альтернативы, не стесняйтесь предлагать :)
Сделайте это асинхронным. Никогда, НИКОГДА не блокируйте пользовательский интерфейс. Представьте, что вы представляете это представление с помощью контроллера навигации, загрузка занимает слишком много времени, и пользователь хочет вернуться к предыдущему виду. С вашей логикой это будет невозможно, и пользователь будет вынужден оставаться в этом представлении до тех пор, пока сетевая выборка не завершится. –
@ Спасибо, я сделаю асинч. Я не обратил на это внимания. – DevC
Как предложение, в объективе C является хорошей практикой в операторах «if» для проверки недействительности, поскольку ваш «if (jsonData! = Nil)» записывает их как: «if (jsonData)» –