Отображение панели инструментов не работает в фоновой очереди?

#ios #objective-c #xcode

#iOS #objective-c #xcode

Вопрос:

Я хочу, чтобы нижняя панель инструментов исчезала, когда просмотр прокрутки прекращался, это не проблема:

 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
                       self.toolbar.hidden = NO;
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
                       self.toolbar.hidden = NO;
}

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
                       self.toolbar.hidden = NO;
}
  

Итак, это работает хорошо, но проблема с этим подходом заключается в том, что вид нижней панели мерцает, как будто у нее приступ. Я этого не хочу, поэтому я переведу ее в режим ожидания на одну секунду, прежде чем она появится снова. Проблема в том, что self.toolbar.hidden не отвечает в фоновом потоке:

 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
                   ^{
                       NSLog(@"Hello?");
                       sleep(1);
                       self.toolbar.hidden = NO;
                   });
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
                   ^{
                       NSLog(@"Hello?");
                       sleep(1);
                       self.toolbar.hidden = NO;
                   });

}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
                   ^{
                       NSLog(@"Hello?");
                       sleep(1);
                       self.toolbar.hidden = NO;
                   });
}
  

Итак, в этом сценарии self.toolbar.hidden = NO; ничего не делает. NSLogs проходят без проблем, поэтому я подумал, что попробую этот подход, но он тоже не работает:

 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
                   ^{
                       NSLog(@"Hello?");
                       sleep(1);
                       [self unhideToolbar];
                   });
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
                   ^{
                       NSLog(@"Hello?");
                       sleep(1);
                       [self unhideToolbar];
                   });

}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
                   ^{
                       NSLog(@"Hello?");
                       sleep(1);
                       [self unhideToolbar];
                   });
}

-(void)unhideToolbar
{
    NSLog(@"toolbar unhidden");
    self.toolbar.hidden = NO;
}
  

Я не могу понять, что я здесь делаю не так… Все NSLogs работают без проблем, но отображение панели инструментов не имеет ничего общего с асинхронными функциями.

Кто-нибудь знает, почему это происходит?

Комментарии:

1. Изменение пользовательского интерфейса должно быть реализовано в основной очереди

Ответ №1:

Изменения пользовательского интерфейса должны быть в основной очереди. Попробуйте отправить обратно к ней следующим образом:

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
                   ^{
                       NSLog(@"Hello?");
                       sleep(1);
                       dispatch_async(dispatch_get_main_queue(), ^{
                           [self unhideToolbar];
                       });
                   });