2014-02-18 2 views
0

먼저 디스패치 큐에서 다음 코드를 호출하면 완료 블록이 호출되지 않습니다. UIView 애니메이션 완료 블록이 호출되지 않습니다.

- (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 방법을 삭제하고 viewDidLoadstartProgress 방법을 실행

,
완료 블록이라고합니다. 내 코드를 어떻게 수정해야합니까?
dispatch_asyncdispatch_async(dispatch_get_main_queue(),..),
으로 변경하려고 시도했지만 완료 블록이 호출되었지만 비동기식으로 startProgress 메서드를 실행하고 싶습니다.

알려 주시기 바랍니다.

+0

어쩌면 dispatch_async (initialize_queue ... – Wonil

답변

4

GUI와 연결된 모든 것은 메인 스레드에서 호출되거나 메인 큐로 푸시되어야합니다. 다른 경우에는 예상되는 동작이 보장되지 않습니다.

그래서 당신은 항상 비동기 그래서 당신이 정말로 그것을위한 별도의 큐를 필요가 있다고 생각하지 않습니다 실행 또한

dispatch_get_main_queue() 

애니메이션을 사용합니다.

+0

블록의 내부에서 다시 [self startProgress]를 주 디스패치 큐에 넣을 수 있습니다. performSelectorOnMainThread를 사용하여 문제를 해결합니다. – nao0811ta

관련 문제