Skip to content

Instantly share code, notes, and snippets.

@serhiybutz
serhiybutz / code.swift
Last active August 18, 2020 21:16
Combine: withLatestFrom, 03
import UIKit
import Combine
extension UIRefreshControl {
private static var beginRefreshingAssociatedKey = "BeginRefreshingPublisher"
private typealias BeginRefreshingPublisher = PassthroughSubject<Void, Never>
private var internalBeginRefreshingPublisher: BeginRefreshingPublisher {
var publisher = objc_getAssociatedObject(
@serhiybutz
serhiybutz / code.swift
Created July 20, 2020 23:55
Combine: withLatestFrom, 02
var cancellables = Set<AnyCancellable>()
func setupPipelines() {
let searchPublisher = searchBar.searchTextField.textPublisher
.prepend(searchBar.text!)
.eraseToAnyPublisher()
let sparsedSearchPublisher = searchPublisher
.debounce(for: .seconds(0.3), scheduler: DispatchQueue.main)
.eraseToAnyPublisher()
@serhiybutz
serhiybutz / code.swift
Created July 20, 2020 22:14
Combine: withLatestFrom, 01
import UIKit
import Combine
extension UITextField {
var textPublisher: AnyPublisher<String?, Never> {
NotificationCenter.default
.publisher(
for: UITextField.textDidChangeNotification,
object: self)
.map(\.object)
@serhiybutz
serhiybutz / code.swift
Created July 18, 2020 15:25
Combine: shareReplay, 02
import Combine
let measurements = PassthroughSubject<Int, Never>()
let diagramDataSource = measurements
.share(replay: 3)
let subscriber1 = diagramDataSource
.sink(
receiveCompletion: { completion in
@serhiybutz
serhiybutz / code.swift
Created July 18, 2020 13:49
Combine: shareReplay, 01
import Combine
final class ShareReplay<Upstream: Publisher>: Publisher {
typealias Output = Upstream.Output
typealias Failure = Upstream.Failure
var recording = Record<Output, Failure>.Recording()
var upstreamShare: AnyPublisher<Output, Failure>
let bufferCapacity: Int
var subscription: AnyCancellable?
@serhiybutz
serhiybutz / code.swift
Last active August 11, 2020 04:05
Combine: zip issue, 08
import Combine
import XCombine
let events = PassthroughSubject<String, Never>()
let numbers = (0...).publisher
let subscriber = events
.x.zip(numbers)
.map { ($1, $0) }  // swap
@serhiybutz
serhiybutz / code.swift
Last active August 11, 2020 03:59
Combine: zip issue, 07
import Combine
let events = PassthroughSubject<String, Never>()
let subscriber = events
.scan(nil) { a, v in
return (a == nil ? 0 : a!.0 + 1, v)
}
.compactMap { $0 }
.sink(receiveValue: { value in
@serhiybutz
serhiybutz / code.swift
Last active August 11, 2020 04:14
Combine: zip issue, 05
import Combine
let events = PassthroughSubject<String, Never>()
let numbers = (0...).publisher
.print("numbers")
let subscriber = events
.print("events")
.zip(numbers)
@serhiybutz
serhiybutz / code.swift
Last active August 11, 2020 04:21
Combine: zip issue, 03
import Combine
let events = PassthroughSubject<String, Never>()
let numbers = (0...).publisher
.print("numbers")
let subscriber = events
.print("events")
.zip(numbers)
@serhiybutz
serhiybutz / code.swift
Last active August 11, 2020 04:26
Combine: zip issue, 01
import Combine
let events = PassthroughSubject<String, Never>()
let numbers = (0..<100).publisher
let subscriber = events
.zip(numbers)
.map { ($1, $0) } // swap
.sink(