2012-10-18 6 views
2

나는 사용자 이벤트에 응답하여 "긴"동작을 수행하는 올바른 방법을 배회하고 있습니다. 예를 들어,이 슬라이드를 사용하면 화면을 0.5 초 이상 움직이는 블록을 취소 할 수 있습니다. [self coreDataAction] 자체는 약 0.3 초 ​​걸릴 수 있습니다.iPhone iOS UIView animateWithDuration 블록으로 작업을 수행하는 올바른 방법은 무엇입니까?

사용자가 애니메이션을 끝내면 액션이 완료되도록하고 싶습니다 (사용자가 실수로 다른 컨트롤러로 이동하거나 작업이 완료되었다고 생각하는 응용 프로그램을 닫지 않길 바랍니다).

여기에 [self coreDataAction];을 넣어야합니까? 블록 위, 블록 내 또는 완료 블록에서?

//should I put it here? 

CGPoint slideToCancelCenter = slideToCancel.view.center; 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.goToSleepButton.center = slideToCancelCenter; 
     [UIView setAnimationDuration:0.5]; 
     CGPoint sliderCenter = slideToCancel.view.center; 
     sliderCenter.y += slideToCancel.view.bounds.size.height; 
     slideToCancel.view.center = sliderCenter; 

//should I put it here?   
// [self coreDataAction]; 
    } completion:^(BOOL finished) { 
//should I put it here? 
    } ]; 
+1

'[UIView setAnimationDuration : 0.5];는 필요하지 않습니다. 이미 기간을 설정했습니다. 블록 기반 애니메이션을 사용하지 않는 경우 사용하십시오 (차이점은 UIView 클래스 참조). –

+0

이 "액션"이 완료되었는지 여부를 사용자가주의해야한다고 생각하지 않습니다. 계산을 백그라운드에서 수행하고 사용자가 컴퓨터를 기다리는 것보다 더 중요한 일을 수행하도록하십시오. –

답변

1

[자기 coreDataAction]를 가정하면 주 스레드에서 실행, 난 당신이 방법은 애니메이션이 완료되는 시점으로 완료되었는지 확인하기 위해 첫 번째 줄에 넣어해야 말할 것입니다.

+0

'coreDataAction' 메쏘드 안에있는 어떤 호출이라도 호출을 막는다면'coreDataAction'의 실행이 끝날 때까지 애니메이션이 일어나지 않을 것입니다. 이 경우, @AlexStone은'performSelector : withObject : afterDelay :'를 사용하여 비동기 적으로 킥오프 할 수 있지만, 애니메이션 대기열에 넣은 후에'coreDataAction' 메서드의 실행을 시작하는 것이 좋습니다. –

+0

그가 coreDataAction 전에 애니메이션을 완성하기를 원하지 않는다고 이해했기 때문입니다. 비동기로 해제하면 애니메이션이 완료되고 coreDataAction이 계속 작동합니다. 애니메이션은 0.5 초 밖에 안되기 때문에, 내 생각에 그는 coreDataAction 이후에 애니메이션을 시작한다고 생각합니다. –

+0

백그라운드 데이터 스레드에서 수행하면 컨텍스트 병합 (서로 다른 데이터가있는 자체 스크래치 패드가있는 두 개의 스레드)이 필요할 수 있으므로 코어 데이터 작업에 대한 추가 우려 사항이 있습니다. 나는 이런 종류의 활동을 아직 할 준비가되어 있지 않다. –

2

이것을 처리하는 더 좋은 방법은 화면에 애니메이션을 적용한 다음 완료 핸들러에서 coreDataAction을 시작하는 것일 수 있습니다. 메서드 실행이 완료되면 메서드를 호출하여 슬라이드에 애니메이션을 적용하여 화면 외의보기를 취소 할 수 있습니다.

+0

고맙습니다.이 방법이 효과가있을 것 같습니다. –

관련 문제