A Task represents a unit of asynchronous work that runs concurrently. It allows you to start work that can run independently from the current code flow.
Click to reveal answer
beginner
How do you create a new concurrent task in Swift?
You create a new task by calling Task { ... } and placing asynchronous code inside the closure. This runs the code concurrently.
Click to reveal answer
intermediate
What is the difference between Task and async/await?
async/await lets you write asynchronous code that waits for results, while Task launches work concurrently without blocking the current thread.
Click to reveal answer
intermediate
How can you cancel a running Task?
You can call task.cancel() on the Task instance. Inside the task, you should check for cancellation using Task.isCancelled to stop work cooperatively.
Click to reveal answer
beginner
What happens if you call Task { ... } inside a synchronous function?
The task starts running concurrently in the background immediately, allowing the synchronous function to continue without waiting for the task to finish.
Click to reveal answer
Which Swift code launches a new concurrent task?
ATask { await fetchData() }
BfetchData()
Casync fetchData()
DDispatchQueue.main.async { fetchData() }
✗ Incorrect
Using Task { ... } launches a new concurrent task. Option D uses GCD, which is different from Swift concurrency tasks.
How do you check if a task has been cancelled inside its code?
Aif task.isCancelled { ... }
Bif Task.isCancelled { ... }
Cif cancelled { ... }
Dif Task.cancelled { ... }
✗ Incorrect
Task.isCancelled is a static property to check cancellation inside the task.
What does Task { ... } return?
AAn async function
BVoid
CA DispatchQueue
DA Task instance representing the concurrent work
✗ Incorrect
Task { ... } returns a Task instance that you can use to manage the concurrent work.
Which statement is true about Task in Swift concurrency?
AIt runs code concurrently without blocking the current thread
BIt blocks the current thread until the task finishes
CIt only runs on the main thread
DIt is used to create synchronous functions
✗ Incorrect
Task runs code concurrently, allowing the current thread to continue.
How can you cancel a running Task?
ASet a flag variable to false
BCall <code>stop()</code> on the Task instance
CCall <code>cancel()</code> on the Task instance
DYou cannot cancel a Task once started
✗ Incorrect
You cancel a task by calling its cancel() method.
Explain how to launch concurrent work using Task in Swift and how cancellation works.
Think about starting work that runs alongside your current code and how you can stop it if needed.
You got /4 concepts.
Describe the difference between using async/await and launching a Task in Swift concurrency.
Consider when you want to wait for a result versus when you want to start work and continue immediately.
You got /4 concepts.
Practice
(1/5)
1.
What does Task { } do in Swift concurrency?
easy
A. Creates a synchronous function
B. Starts a new piece of work that runs concurrently with other code
C. Blocks the main thread until the work finishes
D. Stops all other tasks from running
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, which Task does not do.
Final Answer:
Starts a new piece of work that runs concurrently with other code -> Option B
Quick Check:
Task starts concurrent work = C [OK]
Hint: Task runs code concurrently without blocking [OK]
Common Mistakes:
Thinking Task blocks the main thread
Confusing Task with synchronous functions
Believing Task stops other tasks
2.
Which of the following is the correct syntax to start a new concurrent task in Swift?
?
easy
A. task { fetchData() }
B. async Task { fetchData() }
C. Task.start { fetchData() }
D. Task { await fetchData() }
Solution
Step 1: Recall correct Task syntax
The correct way to start a concurrent task is Task { } with a closure inside. Using await is 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 D
Quick Check:
Correct Task syntax = B [OK]
Hint: Task must be capitalized and use braces { } [OK]
The Task { } 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 A
Quick Check:
Task prints Start immediately, main prints Outside, then Task prints End = D [OK]
Hint: Task closure starts immediately and prints Start before main thread prints Outside [OK]
Common Mistakes:
Assuming 'Outside' prints before 'Start'
Ignoring that Task closure starts immediately
Thinking Task blocks main thread
4.
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.
medium
A. Missing await before fetchData()
B. Task cannot be used with async functions
C. print cannot be called inside Task
D. fetchData() must be synchronous
Solution
Step 1: Check async function call
Since fetchData() is async, it must be called with await inside an async context like Task.
Step 2: Identify missing await
The code misses await before fetchData(), causing a compile error.
Final Answer:
Missing await before fetchData() -> Option A
Quick Check:
Async calls need await = A [OK]
Hint: Async calls inside Task need await keyword [OK]
Common Mistakes:
Forgetting await on async calls
Thinking Task disallows async calls
Believing print can't be used inside Task
5.
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?
hard
A. Task {
let data = fetchUserData()
updateUI(with: data)
}
B. let data = fetchUserData()
updateUI(with: data)
C. Task {
let data = await fetchUserData()
updateUI(with: data)
}
D. updateUI(with: fetchUserData())
Solution
Step 1: Understand async fetch and UI update
Fetching user data is async and takes time. To avoid blocking, use Task { } 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 C
Quick Check:
Await async fetch inside Task, then update UI = A [OK]
Hint: Await async calls inside Task before UI update [OK]
Common Mistakes:
Calling async function without await
Updating UI outside Task causing blocking
Not using Task for concurrency
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.