未调用UIView动画完成块

时间:2014-02-18 13:17:57

标签: ios animation uiview dispatch

当我第一次从调度队列中调用以下代码时,未调用完成块。

- (void)viewDidLoad
{
    [super viewDidLoad];
    dispatch_queue_t initialize_queue;
    initialize_queue = dispatch_queue_create("init", NULL);
    dispatch_async(initialize_queue, ^{
        _onInit = YES;
        _isRunning = NO;
        [self startProgress];
        _onInit = NO;
    });
} 

 - (void)startProgress
 {
  if (!_isRunning) {
    _isRunning = YES;
    NSLog(@"Starting");
    [UIView animateWithDuration:0.5 animations:^{
        self.progressStatusButton.hidden = NO;
        self.activityLeftConstraint.constant = _activityLeftSpace;
        self.activityWidthConstraint.constant = _activityWidth;
        self.buttonWidthConstraint.constant = _progressStatusButtonWidth;
        self.buttonLeftConstraint.constant = _progressStatusButtonLeftSpace;
        self.activityView.alpha = 1.0;
    }completion:^(BOOL finished){
        NSLog(@"Start Animating");
        [self.activityView startAnimating];
    }];
  }
 }

当我删除dispatch_aync方法并在startProgress中执行viewDidLoad方法时, 称完成块。我该如何更正我的代码呢? 我尝试将dispatch_async更改为使用dispatch_async(dispatch_get_main_queue(),..)
然后调用完成块,但我想执行异步startProgress方法。

请告诉我。

1 个答案:

答案 0 :(得分:4)

应该从主线程/推送到主队列调用与GUI连接的所有内容。在其他情况下,不能保证预期的行为。

所以你应该使用

dispatch_get_main_queue()

同样动画总是以异步方式执行,所以我认为你真的不需要单独的队列。