관리 메뉴

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

[iOS - swift] CATransaction 개념(트랜잭션), CALayer, CAGradientLayer 애니메이션 본문

iOS 기본 (swift)

[iOS - swift] CATransaction 개념(트랜잭션), CALayer, CAGradientLayer 애니메이션

jake-kim 2022. 4. 9. 23:28

트랜잭션의 의미

  • 트랜잭션: 원자성, 일관성, 독립성, 지속성을 갖춘 Operation
  • 원자성(atomic): 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력
    • ex) A사람이 B사람에게 돈을 보내는 작업을 한 경우, A사람은 돈이 빠져나갔지만 B사람한테 돈이 전달되지 않은 경우, 원자성 위배
  • 일관성(Consistency): n번 Operation을 했을 때 기대하는 값이 모두 일관적으로 동일해야함
  • 독립성(Isolation): Operation 수행 시 다른 작업이 끼어들지 못하게 하는 것
  • 지속성(Durability): 성공적으로 수행된 Operation은 영원히 반영

애플의 CATransaction

  • 트랜잭션에서 atomic (부분적으로 실행되다가 중단되지 않는 것을 보장) 특성을 따르며, layer에 관한 렌더링 관리에 사용되는 개념
  • CATransaction은 트랜잭션의 성격을 가지고 있기 때문에 type method로 되어있어서, CATransction.begin()과 같이 사용
  • 기능: 애니매이션되는 속성(트리거 여부, 타이밍, 기간 ) 설정
  • 내부적으로는 Core Animation 방법 그대로 따르고 있는 형태

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

CATransaction의 implicit, Explicit 트랜잭션

  • implicit transaction: thread의 runloop마다 자동으로 생성
  • explicit transaction: 직접 호출하는 형태이며, begin()과 commit()으로 layer에 관한 변경사항을 호출하면 CALayer 속성에 관한 커스텀 애니메이션 구현이 가능
    • begin(): 현재 스레드에 대한 새로운 트랜잭션 시작
    • commit(): 현재 트랜잭션 동안 이루어지는 모든 변경사항을 시행
    • setAnimationDuration(_:): 애니메이션의 duration 설정 (디폴트는 2.5초)

CATransaction의 활용

  • CATransaction에는 특정 애니메이션이 끝난 후 completionBlock 처리가 가능
    • CATransaction을 이용하여, pushViewController에 completion block 기능 넣기
import UIKit

extension UINavigationController {
  public func pushViewController(viewController: UIViewController, animated: Bool, completion: @escaping () -> Void = {}) {
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    self.pushViewController(viewController, animated: animated)
    CATransaction.commit()
  }
}

// 사용하는 쪽
self.navigationController?.pushViewController(viewController: vc, animated: true, completion: {
  print("completion!")
})
  • CABasicAnimation 끝난 후 completion을 넣고 싶은 경우 사용
@objc private func didTapButton() {
  CATransaction.begin()
  CATransaction.setCompletionBlock {
    self.button.setTitle("애니메이션 완료!", for: .normal)
  }
  
  let animation = CABasicAnimation(keyPath: "backgroundColor")
  animation.fromValue = self.randomColor.cgColor
  animation.toValue = self.randomColor.cgColor
  animation.duration = 3
  animation.repeatCount = 1
  self.myView.layer.add(animation, forKey: "myAnimation")
  
  CATransaction.commit() // Commits outer transaction
}

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

 

* 참고

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

https://ko.wikipedia.org/wiki/ACID

Comments