InteractionManager
InteractionManager는 인터랙션과 애니메이션이 완료된 후에 장시간 실행되는 작업을 예약할 수 있게 한다. 특히, 이는 자바스크립트 애니메이션이 원활하게 실행되도록 돕는다.
애플리케이션은 다음과 같이 인터랙션이 끝난 후에 실행될 작업을 예약할 수 있다:
InteractionManager.runAfterInteractions(() => {
// ...장시간 실행되는 동기 작업...
});
다른 스케줄링 옵션과 비교해 보자:
requestAnimationFrame()
은 시간에 따라 뷰를 애니메이션화하는 코드에 사용한다.setImmediate/setTimeout()
은 코드를 나중에 실행하지만, 이는 애니메이션을 지연시킬 수 있다.runAfterInteractions()
는 활성 애니메이션을 지연시키지 않고 코드를 나중에 실행한다.
터치 처리 시스템은 하나 이상의 활성 터치를 '인터랙션'으로 간주하며, 모든 터치가 끝나거나 취소될 때까지 runAfterInteractions()
콜백을 지연시킨다.
InteractionManager는 또한 애플리케이션이 애니메이션 시작 시 인터랙션 '핸들'을 생성하고 완료 시 이를 해제함으로써 애니메이션을 등록할 수 있게 한다:
const handle = InteractionManager.createInteractionHandle();
// 애니메이션 실행... (`runAfterInteractions` 작업이 큐에 추가됨)
// 나중에, 애니메이션 완료 시:
InteractionManager.clearInteractionHandle(handle);
// 모든 핸들이 해제되면 큐에 있는 작업이 실행됨
runAfterInteractions
는 일반 콜백 함수나 Promise
를 반환하는 gen
메서드를 가진 PromiseTask
객체를 받는다. PromiseTask
가 제공되면, 이전에 동기적으로 큐에 추가된 다음 작업을 시작하기 전에 완전히 해결된다(또한 runAfterInteractions
를 통해 더 많은 작업을 예약하는 비동기 의존성도 포함).
기본적으로, 큐에 있는 작업은 하나의 setImmediate
배치에서 함께 실행된다. setDeadline
이 양수로 호출되면, 작업은 데드라인(js 이벤트 루프 실행 시간 기준)이 다가올 때까지만 실행되고, 그 시점에서 실행은 setTimeout을 통해 양보되어 터치와 같은 이벤트가 인터랙션을 시작하고 큐에 있는 작업이 실행되지 않도록 막아 앱의 반응성을 높인다.
예제
기본
- TypeScript
- JavaScript
- TypeScript
- JavaScript
참고 자료
메서드
runAfterInteractions()
static runAfterInteractions(task?: (() => any) | SimpleTask | PromiseTask);
모든 상호작용이 완료된 후 실행할 함수를 예약한다. 취소 가능한 "Promise"를 반환한다.
createInteractionHandle()
static createInteractionHandle(): Handle;
매니저에게 상호작용이 시작되었음을 알린다.
clearInteractionHandle()
은 상호작용이 완료되었음을 관리자에게 알리는 역할을 한다.
static clearInteractionHandle(handle: Handle);
setDeadline()
static setDeadline(deadline: number);
양수 값을 설정하면 setTimeout
을 사용해 이벤트 루프 실행 시간이 deadline
값에 도달한 후에 모든 작업을 예약한다. 그렇지 않으면 모든 작업이 하나의 setImmediate
배치로 실행된다(기본값).