This commit is contained in:
Lukas Stabe 2022-10-08 19:12:15 +02:00
parent 2608249672
commit 0700d78fbd
4 changed files with 27 additions and 9 deletions

View File

@ -18,7 +18,7 @@ final class StateManager: ObservableObject {
private init() { }
static let shared = StateManager()
@Published var state = State.a
@Published var state = State.a //b(["eins", "2", "III"])
}
struct ContentView: View {

View File

@ -130,8 +130,15 @@ extension FiberReconciler {
// Create the node and its element.
var nextValue = nextValue
print("TreeReducer visiting view \(nextValue)")
let resultChild: Result
if let existing = partialResult.nextExisting {
print("updating existing \(existing)")
let elementParent = partialResult.fiber?.element != nil
? partialResult.fiber
: partialResult.fiber?.elementParent
existing.elementParent = elementParent
// If a fiber already exists, simply update it with the new view.
let key: ObjectIdentifier?
if let elementParent = existing.elementParent {
@ -145,6 +152,11 @@ extension FiberReconciler {
key.map { partialResult.elementIndices[$0, default: 0] },
partialResult.nextTraits
)
if let n = newContent {
existing.element = .init(from: n)
}
resultChild = Result(
fiber: existing,
visitChildren: visitChildren(partialResult.fiber?.reconciler, nextValue),
@ -158,6 +170,7 @@ extension FiberReconciler {
partialResult.nextExisting = existing.sibling
partialResult.nextExistingAlternate = partialResult.nextExistingAlternate?.sibling
} else {
print("creating new")
let elementParent = partialResult.fiber?.element != nil
? partialResult.fiber
: partialResult.fiber?.elementParent

View File

@ -243,12 +243,12 @@ public final class FiberReconciler<Renderer: FiberRenderer> {
///
/// A `reconcile()` call is queued from `fiberChanged` once per run loop.
func reconcile() {
print("xxx============== BEFORE\n\(current.recursiveDescription)\n\nxxx============== AFTER\n\(alternate.recursiveDescription)")
print("reconcile(), changedFibers: \(changedFibers)")
isReconciling = true
let changedFibers = changedFibers
self.changedFibers.removeAll()
// Create a list of mutations.
print(changedFibers)
let visitor = ReconcilerVisitor(root: current, changedFibers: changedFibers, reconciler: self)
switch current.content {
case let .view(_, visit):
@ -269,11 +269,12 @@ public final class FiberReconciler<Renderer: FiberRenderer> {
// and leaving the current available to be the work in progress
// on our next update.
print("============== BEFORE\n\(current.recursiveDescription)\n\n============== AFTER\n\(alternate.recursiveDescription)")
let alternate = alternate
self.alternate = current
current = alternate
print("============== reconcile done, current is now:\n\(current.recursiveDescription)")
isReconciling = false
for action in afterReconcileActions {

View File

@ -72,7 +72,6 @@ struct ReconcilePass: FiberReconcilerPass {
var shouldReconcile = false
while true {
print(node.fiber as Any)
if !shouldReconcile {
if let fiber = node.fiber,
changedFibers.contains(ObjectIdentifier(fiber))
@ -85,6 +84,8 @@ struct ReconcilePass: FiberReconcilerPass {
}
}
print("run(...) iteration, shouldReconcile: \(shouldReconcile), node:", node.fiber ?? "<nil>")
// If this fiber has an element, set its `elementIndex`
// and increment the `elementIndices` value for its `elementParent`.
if node.fiber?.element != nil,
@ -118,6 +119,7 @@ struct ReconcilePass: FiberReconcilerPass {
// Update `DynamicProperty`s before accessing the `View`'s body.
node.fiber?.updateDynamicProperties()
// Compute the children of the node.
print("run(...): reducing tree")
let reducer = FiberReconciler<R>.TreeReducer.SceneVisitor(initialResult: node)
node.visitChildren(reducer)
@ -230,16 +232,16 @@ struct ReconcilePass: FiberReconcilerPass {
in reconciler: FiberReconciler<R>,
caches: FiberReconciler<R>.Caches
) -> Mutation<R>? {
print("rec node:", node.fiber?.typeInfo?.type, node.fiber?.alternate?.typeInfo?.type)
print("reconcile(...), node:", node.fiber ?? "<nil>", "alternate:", node.fiber?.alternate ?? "<nil>")
if let element = node.fiber?.element,
let index = node.fiber?.elementIndex,
let parent = node.fiber?.elementParent?.element
{
print("actually do it")
if node.fiber?.alternate == nil { // This didn't exist before (no alternate)
if node.fiber?.alternate?.element == nil { // This didn't exist before (no alternate)
if let fiber = node.fiber {
invalidateCache(for: fiber, in: reconciler, caches: caches)
}
print(" -> .insert")
return .insert(element: element, parent: parent, index: index)
} else if node.fiber?.typeInfo?.type != node.fiber?.alternate?.typeInfo?.type,
let previous = node.fiber?.alternate?.element
@ -247,6 +249,7 @@ struct ReconcilePass: FiberReconcilerPass {
if let fiber = node.fiber {
invalidateCache(for: fiber, in: reconciler, caches: caches)
}
print(" -> .replace")
// This is a completely different type of view.
return .replace(parent: parent, previous: previous, replacement: element)
} else if let newContent = node.newContent,
@ -255,6 +258,7 @@ struct ReconcilePass: FiberReconcilerPass {
if let fiber = node.fiber {
invalidateCache(for: fiber, in: reconciler, caches: caches)
}
print(" -> .update")
// This is the same type of view, but its backing data has changed.
return .update(
previous: element,
@ -267,7 +271,7 @@ struct ReconcilePass: FiberReconcilerPass {
)
}
}
print("nvm el", node.fiber?.element != nil, "ind", node.fiber?.elementIndex != nil, "par", node.fiber?.elementParent?.element != nil)
print(" -> nil, element", node.fiber?.element != nil, "elementIndex", node.fiber?.elementIndex != nil, "elementParent", node.fiber?.elementParent?.element != nil)
return nil
}