Subscribe to mutations for creating real-time clients.
Because the lifetime of the subscription will last longer than the lifetime of a single function, you can create an instance variable at the top of your class:
```swift
var subscription: AmplifyAsyncThrowingSequence>
```
```swift
var subscription: AnyCancellable?
```
To listen to creation updates, you can use the following code sample:
```swift
func createSubscription() {
subscription = Amplify.API.subscribe(request: .subscription(of: Todo.self, type: .onCreate))
Task {
do {
for try await subscriptionEvent in subscription {
switch subscriptionEvent {
case .connection(let subscriptionConnectionState):
print("Subscription connect state is \(subscriptionConnectionState)")
case .data(let result):
switch result {
case .success(let createdTodo):
print("Successfully got todo from subscription: \(createdTodo)")
case .failure(let error):
print("Got failed result with \(error.errorDescription)")
}
}
}
} catch {
print("Subscription has terminated with \(error)")
}
}
}
```
```swift
func createSubscription() {
let sequence = Amplify.API.subscribe(request: .subscription(of: Todo.self, type: .onCreate))
subscription = Amplify.Publisher.create(sequence)
.sink {
if case let .failure(apiError) = $0 {
print("Subscription has terminated with \(apiError)")
} else {
print("Subscription has been closed successfully")
}
}
receiveValue: { result in
switch result {
case .connection(let subscriptionConnectionState):
print("Subscription connect state is \(subscriptionConnectionState)")
case .data(let result):
switch result {
case .success(let createdTodo):
print("Successfully got todo from subscription: \(createdTodo)")
case .failure(let error):
print("Got failed result with \(error.errorDescription)")
}
}
}
}
```
### Unsubscribing from updates
#### Async/Await
To unsubscribe from updates, you can call `cancel()` on the subscription.
```swift
func cancelSubscription() {
// Cancel the subscription listener when you're finished with it
subscription?.cancel()
}
```
#### Combine
Calling `cancel()` on the sequence will disconnect the subscription from the backend. Any downstream subscribers will also be cancelled.
```swift
let sequence = Amplify.API.subscribe(...)
let subscription = Amplify.Publisher.create(sequence)
let allUpdates = subscription.sink(...)
let filteredUpdates = subscription.filter{...}.sink(...)
sequence.cancel() // sequence is now disconnected
// allUpdates and filteredUpdates will no longer receive data
```
Similarly, calling `cancel()` on the Combine subscriber (e.g., the `AnyCancellable` returned from `sink()`) will cause the underlying sequence to cancel. This will cause all attached subscribers to stop receiving updates.
```swift
allUpdates.cancel() // sequence is disconnected
// filteredUpdates will no longer receive data
```