관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 트랜잭션으로 completion 구현 방법 (CATransaction, begin(), setCompletionBlock(), commit()) 본문

iOS 응용 (swift)

[iOS - swift] 트랜잭션으로 completion 구현 방법 (CATransaction, begin(), setCompletionBlock(), commit())

jake-kim 2023. 8. 9. 23:37

CATransaction을 통해 애니메이션 종료 후 completion 실행 구현

completion 구현 방법

  • 특정 애니메이션이나 화면 전환이나, 특정 작업 후 completion 을 실행시키고 싶은 경우 보통의 API는 completion이 있지만 없을 때 CATransaction를 사용하면 completion 구현이 가능
  • CATransaction은 렌더링에 관한 작업들을 그룹화하는 것

https://developer.apple.com/documentation/quartzcore/catransaction

  • 렌더링 트리를 그룹화 한다는 것
    • 애니메이션이나, 화면전환이나 UI에 관한 업데이트들을 하나로 그룹화하는 것
    • Core Animation에서 애니메이션과 관련된 여러 속성들을 하나로 묶어서 실행한다는 의미

CATransaction으로 completion 만드는 방법

  • 1) CATransaction.begin()을 통해 새로운 트랜잭션을 시작 (= 현재 스레드에서 애니메이션과 관련된 여러 속성들을 하나로 묶는다는 의미)

https://developer.apple.com/documentation/quartzcore/catransaction/1448282-begin

  • 2) CATransaction.setCompletionBlock(completion)을 사용하여 completion을 저장 (트랜잭션이 끝나면 completion을 실행한다는 의미)

https://developer.apple.com/documentation/quartzcore/catransaction/1448281-setcompletionblock

  • 3) 특정 애니메이션을 실행하는 코드를 넣은 후, CATransaction.commit()을 사용하여 트랜잭션 그룹을 닫는다는 의미

https://developer.apple.com/documentation/quartzcore/catransaction/1448255-commit

ex) 

1) CATransaction.begin()을 통해 새로운 트랜잭션을 시작

2) CATransaction.setCompletionBlock(completion)을 사용하여 completion을 저장

3) 특정 애니메이션을 실행하는 코드를 넣은 후, CATransaction.commit()을 사용하여 트랜잭션 그룹을 닫음

@objc private func tap() {
    run() {
        print("test!")
    }
}

private func run(completion: @escaping (() -> Void)) {
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    UIView
        .animate(
            withDuration: 5,
            animations: { self.view.backgroundColor = .yellow }
        )
    CATransaction.commit()
}

(완성)

* 전체 코드: https://github.com/JK0369/ExCATransactionCompletion

* 참고

https://developer.apple.com/documentation/quartzcore/catransaction/1448255-commit

https://developer.apple.com/documentation/quartzcore/catransaction/1448281-setcompletionblock

https://developer.apple.com/documentation/quartzcore/catransaction/1448282-begin

https://developer.apple.com/documentation/quartzcore/catransaction

Comments