Node?
Last updated
Last updated
디바이스 화면상 나타나는 모든 객체는 CALayer 로 표현되며, CALayer 에 대한 터치 이벤트와 각종 편의기능 들을 객체로 감싼 형태가 여러분들이 알고 계시는 UIView 입니다.
하지만 View 와 Layer 는 Main-Thread 에서 주로 작동하기 때문에 피드처럼 다양한 컨텐츠가 담긴 스크롤 형태의 UI 에서 Frame Drop 은 불가피 합니다. 뿐만 아니라 이미지 다운로드 및 attributed text decoding 와 관련 로직을 주니어 개발자들이 개발하기에는 어려움이 있습니다.
Texture는 이러한 로직들과 Frame Drop 을 개선하기 위해 View 객체를 감싼 Node 라는 객체를 만들었고, 화면상 나타날 수 있는 모든 구성요소를 스레드 안전성을 유지하면서 유연하고 신속하게 처리합니다.
UIKit 에 UIView 를 기준으로 다양한 SubClass(UIImageView, UIButton etc.) 가 있듯이, Texture 도 ASDisplayNode 를 기준으로 다양한 SubClass를 제공합니다.
UIKit
Texture
UIView
ASDisplayNode
UIScrollView
ASScrollNode
UITableViewCell / UICollectionViewCell
ASCellNode
UILabel
ASTextNode
UITextView
ASEditableTextNode
UIImageView
ASImageNode
AVPlayerLayer
ASVideoNode
UIMoviePlayer
ASVideoPlayerNode
UIControl
ASControlNode
UIButton
ASButtonNode
MKMapView
ASMapNode
Texture 는 UIKit 의 다양한 View Component 에서 제공하는 가장 기본적인 attribute property(attributedText, cornerRadius etc) 를 동일하게 제공합니다. 더 나아가 UIKit 에서 제공하지 않는 특수한 편의기능들도 제공합니다.
예를 들어 UILabel 의 터치영역을 지정하거나 tail truncate attributed string 를 추가하기 위해 보통 TTTAttributedLabel 과 같은 라이브러리를 사용합니다. 하지만 Texture 의 ASTextNode 는 hitTestSlop, link touch, tail truncate attributed string 등의 기능을 추가로 제공합니다.
UIKit
Texture
UIViewController
ASDKViewController
UICollectionView
ASCollectionNode
UITableView
ASTableNode
UIPageViewController
ASPagerNode
UINavigationController
ASNavigationController
UITabBarController
ASTabBarController
Node Container 는 Node 의 Intelligent Preloading 을 자동으로 관리합니다.
Intelligent Preloading 은 모든 Node 의 Layout Measurement, Data Fetching, Decoding, Rendering 이 비동기적으로 수행됨을 의미합니다.
Node Container 없이 Node 를 직접 사용할 수 있지만, 추가적인 호출을 추가하지 않는 한 Node 는 UIKit 같이 화면에 나타나는 경우에만 렌더링 됩니다. 이로 인해 성능이 저하되고, 컨텐츠가 깜박일 수 있습니다.
ASDKViewController는 Generic형태로 ASDisplayNode Subclass를 기반으로 ViewController를 만들 수 있습니다.
예를 들어 UITableViewController와 같은 ViewController를 만들려면 ASDisplayNode대신 ASTableNode를 사용하면 됩니다.
ASDKViewController 대해서 더 자세히 알아보기.
Texture 는 여러분들이 일반적으로 생각하시는 Storyboard 및 Xib 기반으로 UI 를 만들지 않습니다. UI 의 각 컴포넌트를 재사용할 수 있도록 개발이 가능하며 여러 컴포넌트 들을 레고 조합하듯 개발합니다.
필요에 따라서 Texture 에서 제공해주는 Node 를 Subclass 로 만들어서 요구사항에 맞게 개발합니다.
UIKit
Thread
Texture
Thread
init
Main
init
Background
layoutSubviews
Main
didLoad
Main
layoutSpecThatFits
Background
layout
Main
UIKit 과는 다르게 Main Thread 가 아닌 Background Thread 에서 동작합니다.
경고) layer, view, gesture recognizer 등 Main Thread 에서 접근 가능한 속성들은 didLoad 메소드에서 접근해야 합니다.
initialization 이 끝이나고 실질적으로 Node 객체가 load 됐음을 의미합니다. 한번만 호출되며, 여기서 주로 Main Thread 에서 접근 가능한 속성들을 사용할 수 있습니다. (ex. gesture recognizer나 또는 layer, view property 접근 등등.)
Texture는 UIKit 다르게 Auto-Layout 을 사용하지 않습니다.
대신, Yoga Layout Flex-Box 기반으로 Layout 을 설계합니다. 해당 method 는 Background Thread 에서 동작하며, 레이아웃 설계에 대한 무거운 로직들을 처리하고 개발자 의도에 따라 설계된 레이아웃을 빌드합니다.
주의할 점 : 순수하게 Texture에서 제공해주는 LayoutSpec 및 Layout Elements Properties 만 사용해야하며 그 이외 Main Thread에서 사용가능한 API나 GCD, Lock과 같이 Layout Building 과정에 방해되는 요소를 사용해서는 안됩니다.
layoutSpecThatFits 에서 Layout Building 이 끝난 이후 Main Thread 에서 호출되는 메서드입니다. layout 이 변경될 때 마다 호출되며, 여기선 주로 Layout Build 가 완료된 UI 를 Clip Corner한다던가 Gradient 를 추가하는 등 layout 변화에 따른 업데이트가 필요한 추가적인 요소를 처리합니다.
layout build과정에서 node 를 관리하는 flag 이며, layoutSpecThatFits 에서 직접적으로 영향받는 node를 자동으로 추가 및 제거해주는 것을 의미합니다.
예를 들자면 다음과 같습니다.
위의 코드와 같이 automaticallyManagesSubnodes 를 활성화 시켜주면 개발자 의도에 따라 node를 removeFromSupernode 혹은 addSubnode 를 layout building 과정에서 알아서 처리합니다.