[CLEANUP beta] Avoid before observers in ArrayProxy #16166
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR removes one of two remaining internal usages of before observers (one in ArrayProxy and one in EachProxy).
In order to remain API compatible, we simulate
arrayWillChange
events by caching the values of the ArrayProxy upon accessing (e.g. when callingobjectAt
or getting thelength
). AfterarrayWillChange
has been triggered we mark the cache asdirty
and fire thearrayDidChange
event. This will cause the cache to recompute on next access which will generally occur in response to thearrayDidChange
event.There are two further avenues of work:
_arrangedContentArrayDidChange
hook to optimize the syncing of the cache to only the slice that changed.pushObject
don't become O(N).arrangedContent
lazy. You should only need to observe after you've accessed the value once, otherwise why would you care if it has changed?