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: GraphQLSubscriptionOperation?
```
```swift
var subscription: GraphQLSubscriptionOperation?
var dataSink: 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), valueListener: { (subscriptionEvent) in
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)")
}
}
}) { result in
switch result {
case .success:
print("Subscription has been closed successfully")
case .failure(let apiError):
print("Subscription has terminated with \(apiError)")
}
}
}
```
```swift
func createSubscription() {
subscription = Amplify.API.subscribe(request: .subscription(of: Todo.self, type: .onCreate))
dataSink = subscription?.subscriptionDataPublisher.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 .success(let createdTodo):
print("Successfully got todo from subscription: \(createdTodo)")
case .failure(let error):
print("Got failed result with \(error.errorDescription)")
}
}
}
```
### Unsubscribing from updates
#### Listener (iOS 11+)
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 (iOS 13+)
With the Combine flavor of the `subscribe()` API, you have the option of canceling just the downstream Combine subscriber, or the entire GraphQL subscription.
Calling `cancel()` on the subscription will disconnect the subscription from the backend. Any downstream subscribers will also be cancelled. On the other hand, calling `cancel()` on the Combine subscriber (e.g., the `AnyCancellable` returned from `sink()` will cause that Combine subscriber to stop receiving updates, but any other attached subscribers will continue to receive subscription data. For example:
```swift
let subscription = Amplify.API.subscribe(...)
let allUpdates = subscription.subscriptionDataPublisher.sink(...)
let filteredUpdates = subscription.subscriptionDataPublisher.filter{...}.sink(...)
allUpdates.cancel() // subscription is still connected,
// filteredUpdates will still receive data
subscription.cancel() // subscription is now disconnected
// filteredUpdates will no longer receive data
```