Skip to content

Commit b90a7b7

Browse files
committed
Alter members to be static and make observation methods be nonisolated for future actor adoption
1 parent 9d6b53c commit b90a7b7

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

stdlib/public/Observation/Sources/Observation/MemberKeyPaths.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,11 @@ public struct MemberKeyPaths<Root>: SetAlgebra, Hashable {
145145
@available(SwiftStdlib 5.9, *)
146146
extension MemberKeyPaths where Root: Observable {
147147
@inlinable
148-
public init(members: MemberKeyPaths<Root>, root: Root) {
148+
public init(members: MemberKeyPaths<Root>) {
149149
self.init()
150150
for raw in members.raw {
151151
self.formUnion(
152-
root.memberKeyPaths(for:
152+
Root.memberKeyPaths(for:
153153
Unmanaged<PartialKeyPath<Root>>.fromOpaque(raw)
154154
.takeUnretainedValue()))
155155
}

stdlib/public/Observation/Sources/Observation/Observable.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,20 @@
1414
public protocol Observable: Identifiable {
1515
associatedtype Token
1616

17-
func addObserver(
17+
nonisolated func addObserver(
1818
_ observer: some Observer<Self>,
1919
for members: MemberKeyPaths<Self>,
2020
using transactionModel: some ObservationTransactionModel
2121
) -> Token
22-
func removeObserver(_ observation: Token)
23-
func memberKeyPaths(for keyPath: PartialKeyPath<Self>) -> MemberKeyPaths<Self>
22+
nonisolated func removeObserver(_ observation: Token)
23+
nonisolated static func memberKeyPaths(
24+
for keyPath: PartialKeyPath<Self>
25+
) -> MemberKeyPaths<Self>
2426
}
2527

2628
@available(SwiftStdlib 5.9, *)
2729
extension Observable {
28-
public func addObserver<O: Observer>(
30+
public nonisolated func addObserver<O: Observer>(
2931
_ observer: O,
3032
for fields: MemberKeyPaths<Self>
3133
) -> Token where O.Subject == Self {
@@ -34,15 +36,15 @@ extension Observable {
3436
using: ImmediateObservationTransactionModel())
3537
}
3638

37-
public func addObserver<Member>(
39+
public nonisolated func addObserver<Member>(
3840
_ observer: some Observer<Self>,
3941
for keyPath: KeyPath<Self, Member>,
4042
using transactionModel: some ObservationTransactionModel
4143
) -> Token {
4244
addObserver(observer, for: [keyPath], using: transactionModel)
4345
}
4446

45-
public func addObserver<O: Observer, Member>(
47+
public nonisolated func addObserver<O: Observer, Member>(
4648
_ observer: O,
4749
for keyPath: KeyPath<Self, Member>
4850
) -> Token where O.Subject == Self {
@@ -51,7 +53,7 @@ extension Observable {
5153
using: ImmediateObservationTransactionModel())
5254
}
5355

54-
public func memberKeyPaths(
56+
public nonisolated static func memberKeyPaths(
5557
for keyPath: PartialKeyPath<Self>
5658
) -> MemberKeyPaths<Self> {
5759
return [keyPath]

stdlib/public/Observation/Sources/Observation/ObservationRegistrar.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,11 @@ public struct ObservationRegistar<Subject: Observable>: @unchecked Sendable {
9494

9595
public func addObserver<Model: ObservationTransactionModel>(_ observer: some Observer<Subject>, for members: MemberKeyPaths<Subject>, using transactionModel: Model) -> ObservationToken {
9696
let token = ObservationToken()
97+
let observedMembers = MemberKeyPaths(members: members)
9798
state.withCriticalRegion { state in
98-
let entry = Entry(observer: observer, members: members, token: token, model: transactionModel)
99+
let entry = Entry(observer: observer, members: observedMembers, token: token, model: transactionModel)
99100
state.observers[token] = entry
100-
for keyPath in members.raw {
101+
for keyPath in observedMembers.raw {
101102
state.registrations[keyPath, default: []].insert(entry)
102103
}
103104
}

0 commit comments

Comments
 (0)