- (void) setRooms:(NSArray *)newRooms
{
NSLog(@"Main thread(cp3)... %d", [rooms count]);
rooms = newRooms;
[table reloadData];
NSLog(@"Main thread(cp4)... %d", [rooms count]);
}
- (void) parseJSONWithURL:(NSURL *)jsonURL
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSLog(@"Main thread(cp1)...%d", [rooms count]);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
NSLog(@"Background thread(cp1)...%d", [rooms count]);
NSError *error = nil;
// Request the data and store in a string.
NSString *resp = [NSString stringWithContentsOfURL:jsonURL
encoding:NSASCIIStringEncoding
error:&error];
// Convert the String into an NSData object.
NSData *data = [resp dataUsingEncoding:NSASCIIStringEncoding];
// Parse that data object using NSJSONSerialization without options.
NSDictionary *json = [[NSDictionary alloc] init];
json = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
// Return to the main thread to update the UI elements
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"Main thread(cp2)...%d", [rooms count]);
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[self setRooms:[json valueForKey:@"Rooms"]];
});
NSLog(@"Background thread(cp2)...%d", [rooms count]);
});
NSLog(@"Main thread(cp5)...%d", [rooms count]);
}
ответ
Попробуйте
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
NSError *error = nil;
// Request the data and store in a string.
NSString *resp = [NSString stringWithContentsOfURL:jsonURL
encoding:NSASCIIStringEncoding
error:&error];
if (error == nil) {
// Convert the String into an NSData object.
NSData *data = [resp dataUsingEncoding:NSASCIIStringEncoding];
// Parse that data object using NSJSONSerialization without options.
NSDictionary *json = [[NSDictionary alloc] init];
json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
dispatch_sync(dispatch_get_main_queue(), ^{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
_rooms = [json valueForKey:@"Rooms"];
[_table reloadData];
});
}
});
или попробовать
[self performSelectorOnMainThread:@selector(udpateAfterFetch:) withObject: [json valueForKey:@"Rooms"] waitUntilDone:YES];
-(void)udpateAfterFetch:(NSArray or whatever *) yourObject
{
_rooms = yourObject;
[_table reloadData];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
Таблица не перегружаются, потому что любое обновление пользовательского интерфейса должно произойти в основной поток, и это не происходит в ур-строках кода.
Привет @satheeshwaran, спасибо за ваш ответ. Я пробовал обе идеи и все еще не работал ... В моем первоначальном коде я делал обновление пользовательского интерфейса, возвращаясь к основному потоку асинхронным способом, пока вы предлагаете сделать это синхронно - это не работает. Я пытаюсь использовать трюк селектора с фоновой областью или возвращаться в область основного потока и все равно не повезло. –
Кстати, это неожиданное поведение, пока я запускаю его на iOS Simulator. Как вы знаете, страница Apple Developer была недоступна, поэтому я не могу получить доступ к порталу подготовки и тестировать его на реальном устройстве. Не уверен, что это только потому, что я нахожусь в iOS Simulator ... –
Попробуйте отредактированную часть сейчас, это не имеет ничего общего с симулятором. – satheeshwaran
Почему у вас есть 2 других? –
Привет @AbdullahShafique, пожалуйста, обратите внимание, что у меня также есть два прикованных ifs ... первый, если проверяет наличие ссылок и вторую проверку синтаксического анализа. Остальные являются соответствующими блоками отказа –