Understanding SwiftUI view lifecycles – Ole Begemann

Understanding SwiftUI view lifecycles – Ole Begemann


I wrote an app known as SwiftUI View Lifecycle. The app means that you can observe how completely different SwiftUI constructs and containers have an effect on a view’s lifecycle, together with the lifetime of its state and when onAppear will get known as. The code for the app is on GitHub. It may be constructed for iOS and macOS.

Once we write SwiftUI code, we assemble a view tree that consists of nested view values. Situations of the view tree are ephemeral: SwiftUI always destroys and recreates (components of) the view tree because it processes state modifications.

The view tree serves as a blueprint from which SwiftUI creates a second tree, which represents the precise view “objects” which can be “on display” at any given time (the “objects” may very well be precise UIView or NSView objects, but additionally different representations; the precise which means of “on display” can range relying on context). Chris Eidhof likes to name this second tree the render tree (the hyperlink factors to a 3 minute video the place Chris demonstrates this duality, extremely beneficial).

The render tree persists throughout state modifications and is utilized by SwiftUI to ascertain view identification. When a state change causes a change in a view’s worth, SwiftUI will discover the corresponding view object within the render tree and replace it in place, moderately than recreating a brand new view object from scratch. That is after all key to creating SwiftUI environment friendly, however the render tree has one other vital operate: it controls the lifetimes of views and their state.

We will outline a view’s lifetime because the timespan it exists within the render tree. The lifetime begins with the insertion into the render tree and ends with the elimination. Importantly, the lifetime extends to view state outlined with @State and @StateObject: when a view will get faraway from the render tree, its state is misplaced; when the view will get inserted once more later, the state will probably be recreated with its preliminary worth.

The SwiftUI View Lifecycle app tracks three lifecycle occasions for a view and shows them as timestamps:

  • @State = when the view’s state was created (equal to the beginning of the view’s lifetime)
  • onAppear = when onAppear was final known as
  • onDisappear = when onDisappear was final known as

A table with three rows. @State: 1:26 ago. onAppear: 0:15 ago. onDisappear: 0:47 ago.
The lifecycle monitor view shows the timestamps when sure lifecycle occasions final occurred.

The app means that you can observe these occasions in numerous contexts. As you click on your manner via the examples, you’ll discover that the timing of those occasions modifications relying on the context a view is embedded in. For instance:

  • An if/else assertion creates and destroys its baby views each time the situation modifications; state is just not preserved.
  • A ScrollView eagerly inserts all of its kids into the render tree, no matter whether or not they’re contained in the viewport or not. All kids seem instantly and by no means disappear.
  • A Record with dynamic content material (utilizing ForEach) lazily inserts solely the kid views which can be at the moment seen. However as soon as a baby view’s lifetime has began, the record will hold its state alive even when it will get scrolled offscreen once more. onAppear and onDisappear get known as repeatedly as views are scrolled into and out of the viewport.
  • A NavigationStack calls onAppear and onDisappear as views are pushed and popped. State for mother or father ranges within the stack is preserved when a baby view is pushed.
  • A TabView begins the lifetime of all baby views instantly, even the non-visible tabs. onAppear and onDisappear get known as repeatedly because the consumer switches tabs, however the tab view retains the state alive for all tabs.

Listed below are just a few classes to remove from this:

  • Completely different container views might have completely different efficiency and reminiscence utilization behaviors, relying on how lengthy they hold baby views alive.
  • onAppear isn’t essentially known as when the state is created. It might occur later (however by no means earlier).
  • onAppear may be known as a number of instances in some container views. When you want a aspect impact to occur precisely as soon as in a view’s lifetime, contemplate writing your self an onFirstAppear helper, as proven by Ian Eager and Jordan Morgan in Working Code Solely As soon as in SwiftUI (2022-11-01).

I’m certain you’ll discover extra attention-grabbing tidbits while you play with the app. Suggestions is welcome!



author avatar
roosho Senior Engineer (Technical Services)
I am Rakib Raihan RooSho, Jack of all IT Trades. You got it right. Good for nothing. I try a lot of things and fail more than that. That's how I learn. Whenever I succeed, I note that in my cookbook. Eventually, that became my blog. 
rooshohttps://www.roosho.com
I am Rakib Raihan RooSho, Jack of all IT Trades. You got it right. Good for nothing. I try a lot of things and fail more than that. That's how I learn. Whenever I succeed, I note that in my cookbook. Eventually, that became my blog. 

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here


Latest Articles

author avatar
roosho Senior Engineer (Technical Services)
I am Rakib Raihan RooSho, Jack of all IT Trades. You got it right. Good for nothing. I try a lot of things and fail more than that. That's how I learn. Whenever I succeed, I note that in my cookbook. Eventually, that became my blog.