Skip to content

Commit 1e4e7f7

Browse files
authored
[Observation] Update the SPI entries for SwiftUI for direct tracking access (#64198)
1 parent 81aa9b5 commit 1e4e7f7

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ extension ObservationRegistrar {
8181
keyPath: KeyPath<Subject, Member>
8282
) {
8383
if let trackingPtr = _ThreadLocal.value?
84-
.assumingMemoryBound(to: ObservationTracking.AccessList?.self) {
84+
.assumingMemoryBound(to: ObservationTracking._AccessList?.self) {
8585
if trackingPtr.pointee == nil {
86-
trackingPtr.pointee = ObservationTracking.AccessList()
86+
trackingPtr.pointee = ObservationTracking._AccessList()
8787
}
8888
trackingPtr.pointee?.addAccess(keyPath: keyPath, context: context)
8989
}

stdlib/public/Observation/Sources/Observation/ObservationTracking.swift

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@ public struct ObservationTracking {
3838
}
3939
}
4040

41-
struct AccessList {
42-
var entries = [ObjectIdentifier : Entry]()
41+
@_spi(SwiftUI)
42+
public struct _AccessList: Sendable {
43+
internal var entries = [ObjectIdentifier : Entry]()
44+
45+
internal init() { }
4346

44-
mutating func addAccess<Subject: Observable>(
47+
internal mutating func addAccess<Subject: Observable>(
4548
keyPath: PartialKeyPath<Subject>,
4649
context: ObservationRegistrar<Subject>.Context
4750
) {
@@ -53,13 +56,13 @@ public struct ObservationTracking {
5356
_ apply: () -> T,
5457
onChange: @autoclosure () -> @Sendable () -> Void
5558
) -> T {
56-
var accessList: AccessList?
57-
let result = withUnsafeMutablePointer(to: &accessList) { ptr in
59+
var _AccessList: _AccessList?
60+
let result = withUnsafeMutablePointer(to: &_AccessList) { ptr in
5861
_ThreadLocal.value = UnsafeMutableRawPointer(ptr)
5962
defer { _ThreadLocal.value = nil }
6063
return apply()
6164
}
62-
if let list = accessList {
65+
if let list = _AccessList {
6366
let state = _ManagedCriticalState([ObjectIdentifier: Int]())
6467
let onChange = onChange()
6568
let values = list.entries.mapValues { $0.addObserver {
@@ -74,11 +77,11 @@ public struct ObservationTracking {
7477
return result
7578
}
7679

80+
@_spi(SwiftUI)
7781
public static func _installTracking(
78-
_ storage: UnsafeRawPointer,
82+
_ list: _AccessList,
7983
onChange: @escaping @Sendable () -> Void
8084
) {
81-
let list = unsafeBitCast(storage, to: AccessList.self)
8285
let state = _ManagedCriticalState([ObjectIdentifier: Int]())
8386
let values = list.entries.mapValues { $0.addObserver {
8487
onChange()

0 commit comments

Comments
 (0)