Combine II
Publisher functions
Combine II
Publisher functions
0
0
Checkbox to mark video as read
Mark as read

The Combine framework in Swift offers powerful functions that help you manage data streams efficiently. This article will cover some of the essential Combine functions like receive, dropFirst, map, merge, and combineLatest, showcasing how they can be applied in your projects to transform and manage publisher streams.

For the following examples we are going to use the same Publisher and Set of AnyCancellable. You can try this in a Xcode Playground.

import Combine

var publisher: PassthroughSubject<[Int], Never> = PassthroughSubject()

var bag: Set<AnyCancellable> = Set()

1. receive

The receive operator is used to specify the scheduler on which to receive elements from a publisher. This helps ensure that downstream processing occurs on a particular thread, such as the main thread for UI updates.

publisher
	.receive(on: DispatchQueue.main)
    .sink { value in
        print("Received on main thread: \(value)")
    }
    .store(in: &bag)

publisher.send(1)
publisher.send(2)

// Output:
// Received on main thread: 1
// Received on main thread: 2

2. dropFirst

The dropFirst operator skips the first n elements emitted by a publisher. This is useful when you need to ignore initial values or setup events.

publisher
    .dropFirst(2)
    .sink { value in
        print("Received: \(value)")
    }
    .store(in: &bag)

publisher.send(12)
publisher.send(22)
publisher.send(36)
publisher.send(49)

// Output:
// Received: 36
// Received: 49

3. map

The map operator transforms each value emitted by a publisher using a closure. This is a versatile way to modify data streams as needed.

publisher
    .map { $0 * 10 }
    .sink { value in
        print("Received: \(value)")
    }
    .store(in: &bag)

publisher.send(11)
publisher.send(22)

// Output:
// Received: 110
// Received: 220

4. merge

The merge function combines multiple publishers into a single publisher that emits values from any of the merged publishers. This is helpful when you want to unify streams from different sources. The Publishers output type must be the same.

var anotherPublisher: PassthroughSubject = PassthroughSubject()

publisher
    .merge(with: anotherPublisher)
    .sink { value in
        print("Received: \(value)")
    }
    .store(in: &bag)

publisher.send(1)
anotherPublisher.send(100)
anotherPublisher.send(200)
publisher.send(2)
publisher.send(3)
anotherPublisher.send(300)

// Output
// Received: 1
// Received: 100
// Received: 200
// Received: 2
// Received: 3
// Received: 300

5. combineLatest

The combineLatest operator merges the latest values from two or more publishers and emits a tuple containing those values whenever any of the combined publishers emit a new value. This is useful for coordinating state from different sources.

It's important to understand that all the Publishers need to have been sent at least one value before receiving any result:

var anotherPublisher: PassthroughSubject = PassthroughSubject()

publisher
    .combineLatest(anotherPublisher)
    .sink { value in
        print("Received: \(value)")
    }
    .store(in: &bag)

publisher.send(1)
publisher.send(2)
anotherPublisher.send("Hello")
anotherPublisher.send("EducaSwift")
publisher.send(3)
anotherPublisher.send("Publishers")

// Output:
// Received: (2, "Hello")
// Received: (2, "EducaSwift")
// Received: (3, "EducaSwift")
// Received: (3, "Publishers")

Combining a collection of publishers

In the examples above we've shown how to use merge or combineLatest with just two Publishers, however we have the option of combining more than that:

var anotherPublisher: PassthroughSubject = PassthroughSubject()
var evenOtherPublisher: PassthroughSubject = PassthroughSubject()

publisher
    .combineLatest(anotherPublisher, evenOtherPublisher)
    .sink { value in
        print("Received: \(value)")
    }
    .store(in: &bag)

publisher.send(1)
publisher.send(2)
evenOtherPublisher.send(true)
anotherPublisher.send("Hello")
anotherPublisher.send("EducaSwift")
publisher.send(3)
anotherPublisher.send("Publishers")

// Output:
// Received: (2, "Hello", true)
// Received: (2, "EducaSwift", true)
// Received: (3, "EducaSwift", true)
// Received: (3, "Publishers", true)

0 Comments

Join the community to comment

Be the first to comment

Accept Cookies

We use cookies to collect and analyze information on site performance and usage, in order to provide you with better service.

Check our Privacy Policy