-1

Я пытаюсь установить «UIActivityIndicatorView» в качестве вспомогательного элемента в одном из моих «UITableViewCell», таким образом, как активирует анимацию ActivityIndicator, когда пользователь коснется этой ячейки. Добавить следующий код в методе «didSelectRowAtIndexPath»:UIActivityIndicatorView не смотрит

UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath]; 

UIActivityIndicatorView * activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

NSThread * newThread1 = [[NSThread alloc]initWithTarget:self selector:@selector(carregarNoticias) object:nil]; 

switch (indexPath.row) { 
    case 0: 
     cell.accessoryView = activity; 
     [activity startAnimating]; 
     sleep(0.01); 
     [newThread1 start]; 

     while (![newThread1 isFinished]) { 
      //waiting for thread 
     } 

     [activity stopAnimating]; 
[self.navigationController pushViewController:noticias animated:YES]; 
break; 

Я ожидал анимировать «UIActivityIndicatorView» в то время как newthread1 работает. Тем не менее, анимация начинается только тогда, когда заканчивается новыйThread1 (и поэтому я больше не хочу анимацию). Я добавил 0.01 секунды в качестве времени сна, чтобы дать время для начала анимации. Тем не менее, это также не решило.

Кто-нибудь знает, что моя ошибка? Я ценю любую помощь!

+1

** Никогда ** блокируйте основную резьбу. – rmaddy

+0

Я также попытался начать анимацию с помощью третьего потока, чтобы не блокировать основной поток, но работал ... – user3435595

ответ

-1

Я не знаю, что вы пытаетесь сделать, добавив задержку, как это. Попробуйте эту строку ниже, возможно, это ваш взгляд .. и еще одна вещь .. пожалуйста, не блокируйте основной поток, как sleep(0.01);, что пользователи привычка, как это ..

cell.accessoryView = activity; 

[activity startAnimating]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 

    // the system will wait until this 
    dispatch_async(dispatch_get_main_queue(), ^(void){ 

     [newThread1 start]; 

    }); 
    // is finished, maybe you dont need the `[NSThread sleepForTimeInterval:3];` 
    // pick the one that suits your implementation.. 

    [NSThread sleepForTimeInterval:3]; 

    dispatch_async(dispatch_get_main_queue(), ^(void){ 

     [activity stopAnimating]; 

     [self.navigationController pushViewController:noticias animated:YES]; 

    }); 
}); 

[NSThread sleepForTimeInterval:3] сон нить как один у вас есть sleep(0.01);

Но использовать его внутри

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ }); 

делает его асинхронным. а также не блокировать основной поток ..

dispatch_async(dispatch_get_main_queue(), ^(void){ в то время как выстреливает код в главном потоке ..

Happy кодирования, ура! :)

+0

Спасибо за ваш повтор! Не могли бы вы рассказать мне немного о коде? Он работает частично: иногда анимация останавливается, и viewController выталкивается до завершения новогоThread1, поэтому содержимое следующего viewController отображается неправильно. Иногда это прекрасно работает! Что [NSThread sleepForTimeInterval: 3]; на самом деле делает? Благодаря! – user3435595

+0

Я отредактировал свой ответ и добавил еще несколько объяснений, ясно ли это сейчас? также я перестраиваю строки и добавляю '[newThread1 start];' inside 'dispatch_async (dispatch_get_main_queue(),^(void) {});', чтобы использовать i для запуска в основном потоке. попробуйте .. :) – 0yeoj

+1

Это потрясающе! Работает как шарм! Теперь ясно. Спасибо! – user3435595

Смежные вопросы