비동기 UI 업데이트가 Texture가 Layout을 계산하는 과정을 방해한다.
위의 UI결과화면은 didLoad 되기 전에 setNeedsLayout을 호출 할 경우 bounds가 최초 또는 Pended Layout Bounds로 처리되는 현상입니다.
이후 setNeedsLayout을 호출해도 변하지 않습니다.
Texture 2.7이후에서만 발생하는 이슈입니다.
위의 현상에 대한 ViewModel과 Model을 확인해봅시다. 코드는 다음과 같습니다.
setNeedsLayout은 attribute가 바뀌었을 때 Layout을 다시계산 하기 위함입니다.
하지만 실제 binding되는 시점은 init이 완료되기 전에 다 된다고 보장 못합니다. 비동기적으로 처리되기 때문입니다.
이것이 didLoad 이전 시점에서 binding을 처리하게 되면 setNeedsLayout을 호출하게 되고 더 이상 bounds가 변하지 않게 됩니다.
Texture 2.7: RxSwift와 setNeedsLayout에 대한 고찰
_Texture 2.7에서 많은 변화가 있었습니다. iOS 11 iPhoneX safeArea를 node 어디서든 적용할 수 있게 되었을 뿐만 아니라 전반적으로 퍼포먼스가 상향되었습니다._medium.com
물론 위의 내용과 같이 처리하는 법도 있지만 Texture2.6 때랑 비교하면 매우 슬픈 일입니다.
네트워크작업이나 시간이 다소 필요한 UI Observable를 제외한 단순 Model Property 참초하는 Observable를 굳이 init시점에서 비동기적으로 바인딩을 할 필요는 있는지 생각을 해봅니다.
저는 Observable대신 BehaviorRelay를 이용해서 Value값이 있는 경우 그 즉시 Binding을 처리하도록 Binder를 Customize하였습니다. 코드는 아래와 같습니다.
이 방법또한 최선의 방법은 아닐껍니다. 아마 다음에 다루게 될 내용은 http://texturegroup.org/docs/intelligent-preloading.html 를 이용해서 처리할 수 있는 방법에 대해서 생각해볼 예정입니다.