SharedValueObservation

Experimental

A shared value observation that shares a single underlying database observation for all subscriptions, and thus spares database resources.

For example:

let sharedObservation = ValueObservation
    .tracking { db in try Player.fetchAll(db) }
    .shared(in: dbQueue)

let cancellable = try sharedObservation.start(
    onError: { error in ... },
    onChange: { (players: [Player]) in
        print("Players have changed.")
    })

The sharing only applies if you start observing the database from the same SharedValueObservation instance:

// NOT shared
let cancellable1 = ValueObservation.tracking { db in ... }.shared(in: dbQueue).start(...)
let cancellable2 = ValueObservation.tracking { db in ... }.shared(in: dbQueue).start(...)

// Shared
let sharedObservation = ValueObservation.tracking { db in ... }.shared(in: dbQueue)
let cancellable1 = sharedObservation.start(...)
let cancellable2 = sharedObservation.start(...)
  • Starts observing the database.

    The observation lasts until the returned cancellable is cancelled or deallocated.

    For example:

    let sharedObservation = ValueObservation
        .tracking { db in try Player.fetchAll(db) }
        .shared(in: dbQueue)
    
    let cancellable = try sharedObservation.start(
        onError: { error in ... },
        onChange: { (players: [Player]) in
            print("fresh players: \(players)")
        })