Global actors help keep your app's main work safe and organized by making sure certain code runs only on the main thread. This is important for updating the user interface smoothly.
Global actors (@MainActor) in Swift
@MainActor func yourFunction() { // code that runs on the main thread }
@MainActor is a built-in global actor in Swift for the main thread.
Use it before functions, properties, or classes to ensure they run on the main thread.
@MainActor func updateUI() { print("Updating UI on main thread") }
class ViewModel { @MainActor var title: String = "" @MainActor func changeTitle(newTitle: String) { title = newTitle } }
@MainActor class ViewController { func showAlert() { print("Showing alert on main thread") } }
This program shows a function marked with @MainActor to update UI safely. The async function calls it with await to ensure it runs on the main thread.
import Foundation @MainActor func updateLabel() { print("Label updated on main thread") } func doWork() async { print("Starting work") await updateLabel() print("Work done") } @main struct Main { static func main() async { await doWork() } }
Use await when calling @MainActor functions from outside the main actor.
@MainActor helps prevent crashes caused by updating UI from background threads.
Marking a whole class with @MainActor means all its code runs on the main thread automatically.
@MainActor ensures code runs on the main thread for UI safety.
Use it on functions, properties, or classes that interact with the UI.
Call @MainActor code with await from other threads.
Practice
@MainActor in Swift?Solution
Step 1: Understand the role of @MainActor
@MainActor marks code to run on the main thread, which is important for UI updates.Step 2: Compare options with this purpose
Only To ensure code runs on the main thread for UI safety correctly states that @MainActor ensures code runs on the main thread for UI safety.Final Answer:
To ensure code runs on the main thread for UI safety -> Option DQuick Check:
@MainActor purpose = UI safety on main thread [OK]
- Thinking @MainActor speeds up code
- Confusing @MainActor with background threading
- Assuming @MainActor encrypts data
Solution
Step 1: Recall correct syntax for @MainActor
The attribute @MainActor is placed before the function declaration.Step 2: Check each option's syntax
@MainActor func updateUI() { } correctly places @MainActor before the function name. Others have incorrect placement or syntax.Final Answer:
@MainActor func updateUI() { } -> Option AQuick Check:
@MainActor syntax = before func [OK]
- Placing @MainActor after function name
- Using invalid keywords like mainActor without @
- Inserting @MainActor inside function parentheses
@MainActor
class ViewModel {
func update() {
print("Updated on main thread")
}
}
func backgroundTask() async {
let vm = await ViewModel()
await vm.update()
}
Task {
await backgroundTask()
}
What will be printed when this code runs?Solution
Step 1: Understand @MainActor on ViewModel class
The entire ViewModel class runs on the main thread because of @MainActor.Step 2: Analyze the call to update() with await
Calling await vm.update() from backgroundTask correctly switches to main thread and runs update(), printing the message.Final Answer:
Updated on main thread -> Option BQuick Check:
@MainActor enforces main thread execution [OK]
- Expecting no output due to async
- Thinking update runs on background thread
- Assuming thread violation crash
class DataManager {
@MainActor func save() {
print("Saving data")
}
}
func run() {
let dm = DataManager()
dm.save()
}Solution
Step 1: Identify @MainActor function requirements
Functions marked @MainActor are asynchronous and must be called with await.Step 2: Check call to save()
Calling dm.save() without await causes a compile error because save() is async under @MainActor.Final Answer:
Missing await when calling @MainActor async function -> Option CQuick Check:
@MainActor functions require await calls [OK]
- Calling @MainActor functions without await
- Thinking @MainActor disallows methods on classes
- Believing @MainActor requires static functions
Solution
Step 1: Understand @MainActor usage for UI safety
Marking the whole class with @MainActor ensures all its code runs on the main thread.Step 2: Consider calling methods with await
Calling methods with await from any thread safely switches to main thread for UI updates.Step 3: Evaluate other options
Marking individual properties is less effective; DispatchQueue.global() runs on background thread; final keyword does not ensure thread safety.Final Answer:
Mark the class with @MainActor and call its methods with await from any thread -> Option AQuick Check:
@MainActor class + await calls = safe UI updates [OK]
- Marking only properties instead of class
- Using background queues for UI updates
- Ignoring async/await with @MainActor
Ready to prove it?
Pass the test and this pattern moves unknown
