Tasks let you run work at the same time without waiting. This helps your app stay fast and smooth.
Task for launching concurrent work in Swift
Task {
// code to run concurrently
}The code inside Task { } runs asynchronously.
You can use await inside the task to wait for other async work.
Task {
print("Hello from a task!")
}fetchData() to finish before printing.Task {
let data = await fetchData()
print("Data received: \(data)")
}Task {
for i in 1...3 {
print("Task running step \(i)")
try? await Task.sleep(nanoseconds: 500_000_000) // 0.5 seconds
}
}This program starts a task that waits 1 second, then prints a message. The main run loop keeps running so we can see the output.
import Foundation func fetchData() async -> String { try? await Task.sleep(nanoseconds: 1_000_000_000) // wait 1 second return "Hello from async!" } Task { let message = await fetchData() print(message) } // Keep the program running to see the task output RunLoop.main.run(until: Date().addingTimeInterval(2))
Tasks run concurrently but do not block your main thread.
Use await inside tasks to pause until async work finishes.
Remember to keep your program running if you want to see task output in playgrounds or scripts.
Use Task { } to start work that runs at the same time as other code.
Inside a task, you can use await to wait for async functions.
Tasks help keep your app responsive by doing work in the background.
Practice
What does Task { } do in Swift concurrency?
Solution
Step 1: Understand the purpose of Task
Task { }is used to start work that runs at the same time as other code, without blocking.Step 2: Compare options
Only Starts a new piece of work that runs concurrently with other code correctly describes this concurrent behavior. Options A, B, and D are incorrect because they describe blocking, synchronous, or stopping behavior, whichTaskdoes not do.Final Answer:
Starts a new piece of work that runs concurrently with other code -> Option BQuick Check:
Task starts concurrent work = C [OK]
- Thinking Task blocks the main thread
- Confusing Task with synchronous functions
- Believing Task stops other tasks
Which of the following is the correct syntax to start a new concurrent task in Swift?
?Solution
Step 1: Recall correct Task syntax
The correct way to start a concurrent task isTask { }with a closure inside. Usingawaitis needed if calling async functions.Step 2: Check each option
Task { await fetchData() } uses correct capitalization and syntax. Options A, C, and D use incorrect keywords or syntax.Final Answer:
Task { await fetchData() } -> Option DQuick Check:
Correct Task syntax = B [OK]
- Using lowercase 'task' instead of 'Task'
- Adding 'start' method which doesn't exist
- Adding 'async' keyword before Task incorrectly
What will be printed by this Swift code?
Task {
print("Start")
await Task.sleep(1_000_000_000) // 1 second
print("End")
}
print("Outside")Solution
Step 1: Understand Task concurrency
TheTask { }runs concurrently, so "Start" prints immediately when the task begins.Step 2: Trace print order
Within the Task, "Start" prints first, then the task sleeps for 1 second, then prints "End". Meanwhile, the main thread continues and prints "Outside" immediately after starting the Task.Step 3: Determine exact order
Because the Task closure starts immediately and prints "Start" before sleeping, "Start" prints before "Outside". Then "Outside" prints, and after 1 second delay, "End" prints.Final Answer:
Start\nOutside\nEnd -> Option AQuick Check:
Task prints Start immediately, main prints Outside, then Task prints End = D [OK]
- Assuming 'Outside' prints before 'Start'
- Ignoring that Task closure starts immediately
- Thinking Task blocks main thread
Identify the error in this Swift code that tries to launch a concurrent task:
Task {
let result = fetchData()
print(result)
}Assuming fetchData() is an async function.
Solution
Step 1: Check async function call
SincefetchData()is async, it must be called withawaitinside an async context like Task.Step 2: Identify missing await
The code missesawaitbeforefetchData(), causing a compile error.Final Answer:
MissingawaitbeforefetchData()-> Option AQuick Check:
Async calls need await = A [OK]
- Forgetting await on async calls
- Thinking Task disallows async calls
- Believing print can't be used inside Task
You want to fetch user data and update the UI without blocking the main thread. Which is the best way to launch this concurrent work?
func updateUI(with data: String) {
print("UI updated with \(data)")
}
func fetchUserData() async -> String {
// Simulate network delay
await Task.sleep(2_000_000_000)
return "User123"
}
// What code should you write here?Solution
Step 1: Understand async fetch and UI update
Fetching user data is async and takes time. To avoid blocking, useTask { }to run it concurrently.Step 2: Use await and update UI inside Task
Inside the Task, await the async fetch, then update the UI with the result. This keeps UI responsive.Final Answer:
Task { let data = await fetchUserData() updateUI(with: data) } -> Option CQuick Check:
Await async fetch inside Task, then update UI = A [OK]
- Calling async function without await
- Updating UI outside Task causing blocking
- Not using Task for concurrency
Ready to prove it?
Pass the test and this pattern moves unknown
