Bird
Raised Fist0
iOS Swiftmobile~5 mins

MainActor for UI updates in iOS Swift - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of the MainActor in Swift concurrency?
The MainActor ensures that code runs on the main thread, which is necessary for updating the user interface safely and avoiding crashes.
Click to reveal answer
beginner
How do you mark a Swift function to run on the main thread using MainActor?
You add the attribute @MainActor before the function declaration to ensure it runs on the main thread.
Click to reveal answer
beginner
Why should UI updates be performed on the main thread in iOS apps?
Because UIKit is not thread-safe, updating UI elements on any thread other than the main thread can cause unpredictable behavior or crashes.
Click to reveal answer
intermediate
What happens if you try to update UI from a background thread without using MainActor?
The app may crash or behave unexpectedly because UI updates must happen on the main thread to be safe.
Click to reveal answer
intermediate
How does using @MainActor improve code readability and safety?
It clearly shows which parts of the code run on the main thread, making it easier to avoid threading bugs and maintain UI update safety.
Click to reveal answer
What does the @MainActor attribute do in Swift?
ARuns the code on the main thread
BRuns the code on a background thread
CDisables concurrency
DRuns the code asynchronously on any thread
Why must UI updates happen on the main thread in iOS apps?
ABecause the main thread is faster
BBecause UI updates are asynchronous
CBecause background threads are disabled
DBecause UIKit is not thread-safe
Which of these is a correct way to mark a function to run on the main thread?
A@MainActor func updateUI() { }
Bfunc updateUI() @MainActor { }
Cfunc @MainActor updateUI() { }
Dfunc updateUI() { @MainActor }
What might happen if you update UI from a background thread without MainActor?
AThe UI updates instantly
BNothing happens
CThe app may crash or behave unpredictably
DThe update is queued automatically
How does MainActor help with concurrency in Swift?
AIt forces all code to run sequentially
BIt ensures UI code runs on the main thread safely
CIt disables concurrency
DIt runs code on multiple threads simultaneously
Explain why using @MainActor is important for UI updates in iOS apps.
Think about what happens if UI updates run on the wrong thread.
You got /4 concepts.
    Describe how you would mark a Swift function to ensure it runs on the main thread using MainActor.
    Focus on the syntax to annotate the function.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using @MainActor in Swift UI code?
      easy
      A. To ensure UI updates happen on the main thread
      B. To run background tasks faster
      C. To prevent memory leaks
      D. To encrypt user data

      Solution

      1. Step 1: Understand UI thread requirements

        UI updates must happen on the main thread to avoid crashes and keep the app smooth.
      2. Step 2: Role of @MainActor

        @MainActor ensures the annotated code runs on the main thread, making UI updates safe.
      3. Final Answer:

        To ensure UI updates happen on the main thread -> Option A
      4. Quick Check:

        MainActor = UI updates on main thread [OK]
      Hint: MainActor always means UI code runs on main thread [OK]
      Common Mistakes:
      • Thinking @MainActor speeds up background tasks
      • Confusing @MainActor with memory management
      • Assuming @MainActor encrypts data
      2. Which of the following is the correct way to declare a function that updates UI using MainActor in Swift?
      easy
      A. func updateUI() { @MainActor /* code */ }
      B. func updateUI() @MainActor { /* code */ }
      C. func @MainActor updateUI() { /* code */ }
      D. @MainActor func updateUI() { /* code */ }

      Solution

      1. Step 1: Recall correct syntax for @MainActor

        @MainActor is an attribute placed before the function declaration.
      2. Step 2: Check each option

        @MainActor func updateUI() { /* code */ } correctly places @MainActor before the function name.
      3. Final Answer:

        @MainActor func updateUI() { /* code */ } -> Option D
      4. Quick Check:

        @MainActor before func = correct syntax [OK]
      Hint: @MainActor goes before func keyword [OK]
      Common Mistakes:
      • Placing @MainActor after func name
      • Putting @MainActor inside function body
      • Using @MainActor as a suffix
      3. Consider this Swift code snippet:
      @MainActor
      class ViewModel {
        var count = 0
      
        func increment() {
          count += 1
        }
      }
      
      let vm = ViewModel()
      Task {
        await vm.increment()
        print(vm.count)
      }
      What will be printed?
      medium
      A. Compilation error
      B. 0
      C. 1
      D. Runtime crash

      Solution

      1. Step 1: Understand @MainActor on class

        The class ViewModel is marked @MainActor, so its methods and properties are isolated to the main actor.
      2. Step 2: Analyze the code

        await vm.increment() correctly increments count. Accessing vm.count inside the Task closure is safe because it's running on the main actor context.
      3. Final Answer:

        1 -> Option C
      4. Quick Check:

        Accessing @MainActor properties within the actor context is allowed [OK]
      Hint: @MainActor properties can be accessed safely within actor context without await [OK]
      Common Mistakes:
      • Thinking it prints 1 and forgetting await on print(vm.count)
      • Expecting runtime crash instead of compile error
      • Believing count stays 0 due to async context
      4. You have this Swift function:
      func updateLabel() {
        label.text = "Hello"
      }
      When called from a background thread, the app crashes. How can you fix it using MainActor?
      medium
      A. Add @MainActor before the function declaration
      B. Call updateLabel() inside DispatchQueue.global()
      C. Remove the function and update label directly
      D. Wrap label update inside DispatchQueue.main.async without @MainActor

      Solution

      1. Step 1: Identify cause of crash

        UI updates must happen on main thread; background thread causes crash.
      2. Step 2: Use @MainActor to fix

        Adding @MainActor before function ensures it runs on main thread, preventing crash.
      3. Final Answer:

        Add @MainActor before the function declaration -> Option A
      4. Quick Check:

        @MainActor fixes UI thread crash [OK]
      Hint: Use @MainActor to run UI code on main thread automatically [OK]
      Common Mistakes:
      • Using global queue instead of main queue
      • Updating UI directly from background thread
      • Ignoring thread safety causing crashes
      5. You want to update a SwiftUI view's text label from a background task safely. Which approach correctly uses @MainActor and async/await to update the UI?
      hard
      A. Use DispatchQueue.global().async to update the label
      B. Declare the update function with @MainActor and call it with await inside the background task
      C. Call the update function directly from the background thread without @MainActor
      D. Update the label inside the background task without any special handling

      Solution

      1. Step 1: Understand UI update rules

        UI updates must happen on main thread to avoid crashes and glitches.
      2. Step 2: Use @MainActor with async/await

        Marking the update function with @MainActor ensures it runs on main thread. Calling it with await from background task switches context safely.
      3. Step 3: Evaluate other options

        Options A, B, and D update UI from background thread causing errors or crashes.
      4. Final Answer:

        Declare the update function with @MainActor and call it with await inside the background task -> Option B
      5. Quick Check:

        @MainActor + await = safe UI update [OK]
      Hint: Use @MainActor function called with await for UI updates [OK]
      Common Mistakes:
      • Updating UI directly from background thread
      • Ignoring await when calling @MainActor function
      • Using global queue for UI updates
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard