2013-07-23 3 views
0
- (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]); 
} 
+0

Почему у вас есть 2 других? –

+0

Привет @AbdullahShafique, пожалуйста, обратите внимание, что у меня также есть два прикованных ifs ... первый, если проверяет наличие ссылок и вторую проверку синтаксического анализа. Остальные являются соответствующими блоками отказа –

ответ

0

Попробуйте

[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; 

} 

Таблица не перегружаются, потому что любое обновление пользовательского интерфейса должно произойти в основной поток, и это не происходит в ур-строках кода.

+0

Привет @satheeshwaran, спасибо за ваш ответ. Я пробовал обе идеи и все еще не работал ... В моем первоначальном коде я делал обновление пользовательского интерфейса, возвращаясь к основному потоку асинхронным способом, пока вы предлагаете сделать это синхронно - это не работает. Я пытаюсь использовать трюк селектора с фоновой областью или возвращаться в область основного потока и все равно не повезло. –

+0

Кстати, это неожиданное поведение, пока я запускаю его на iOS Simulator. Как вы знаете, страница Apple Developer была недоступна, поэтому я не могу получить доступ к порталу подготовки и тестировать его на реальном устройстве. Не уверен, что это только потому, что я нахожусь в iOS Simulator ... –

+0

Попробуйте отредактированную часть сейчас, это не имеет ничего общего с симулятором. – satheeshwaran