Skip to content

NetworkOperation: added assertion to ensure that subclasses call completion#2138

Merged
NachoSoto merged 2 commits into
mainfrom
operation-not-started
Dec 21, 2022
Merged

NetworkOperation: added assertion to ensure that subclasses call completion#2138
NachoSoto merged 2 commits into
mainfrom
operation-not-started

Conversation

@NachoSoto

Copy link
Copy Markdown
Contributor

Looking into the leak in #2135, I realized that we have an operation which doesn't call completion, we would be leaking the completion block in the cache.
This ensures that it doesn't happen in tests. In production, we won't risk crashing.

@NachoSoto NachoSoto added the test label Dec 12, 2022
@NachoSoto NachoSoto requested a review from a team December 12, 2022 20:34
@NachoSoto NachoSoto changed the base branch from main to operation-avoid-creation December 12, 2022 20:34
@NachoSoto NachoSoto force-pushed the operation-not-started branch from 50e1800 to 7060f7d Compare December 12, 2022 20:34

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This depends on #2135.

…for cache hits

- Created `CacheableNetworkOperationFactory` to abstract operation and cache key creation
- Instead of always creating an operation, we create a factory first, which pre-computes the cache key
- This cache key is used to determine if it's a cache hit, as well as for the subsequently created operation

I'm still investigating a leak (#2105), and I suspect it's coming from us creating and storing completion blocks, and those staying in memory beyond the lifetime of the operation.
This refactor and performance improvement helps us avoid get more things in memory than we need to.
@NachoSoto NachoSoto force-pushed the operation-avoid-creation branch from cd79981 to beaf492 Compare December 13, 2022 20:55
…mpletion

Looking into the leak in #2135, I realized that we have an operation which doesn't call `completion`, we would be leaking the completion block in the cache.
This ensures that it doesn't happen in tests. In production, we won't risk crashing.
@NachoSoto NachoSoto force-pushed the operation-not-started branch from 79c2ea2 to 63b141b Compare December 13, 2022 20:56
Base automatically changed from operation-avoid-creation to main December 21, 2022 16:13
NachoSoto added a commit that referenced this pull request Dec 21, 2022
…for cache hits (#2135)

### Changes:
- Created `CacheableNetworkOperationFactory` to abstract operation and
cache key creation
- Instead of always creating an operation, we create a factory first,
which pre-computes the cache key
- This cache key is used to determine if it's a cache hit, as well as
for the subsequently created operation

I'm still investigating a leak (#2105), and I suspect it's coming from
us creating and storing completion blocks, and those staying in memory
beyond the lifetime of the operation.
This refactor and performance improvement helps us avoid get more things
in memory than we need to.

See #2138 for how this is tested.
@NachoSoto NachoSoto merged commit c10af1c into main Dec 21, 2022
@NachoSoto NachoSoto deleted the operation-not-started branch December 21, 2022 16:15
NachoSoto pushed a commit that referenced this pull request Dec 21, 2022
**This is an automatic release.**

### Bugfixes
* `ErrorUtils.purchasesError(withUntypedError:)`: handle `PublicError`s
(#2165) via NachoSoto (@NachoSoto)
* Fixed race condition finishing `SK1` transactions (#2148) via
NachoSoto (@NachoSoto)
* `IntroEligibilityStatus`: added `CustomStringConvertible`
implementation (#2182) via NachoSoto (@NachoSoto)
* `BundleSandboxEnvironmentDetector`: fixed logic for `macOS` (#2176)
via NachoSoto (@NachoSoto)
* Fixed `AttributionFetcher.adServicesToken` hanging when called in
simulator (#2157) via NachoSoto (@NachoSoto)
### Other Changes
* `Purchase Tester`: added ability to purchase products directly with
`StoreKit` (#2172) via NachoSoto (@NachoSoto)
* `DNSChecker`: simplified `NetworkError` initialization (#2166) via
NachoSoto (@NachoSoto)
* `Purchases` initialization: refactor to avoid multiple concurrent
instances in memory (#2180) via NachoSoto (@NachoSoto)
* `Purchase Tester`: added button to clear messages on logger view
(#2179) via NachoSoto (@NachoSoto)
* `NetworkOperation`: added assertion to ensure that subclasses call
completion (#2138) via NachoSoto (@NachoSoto)
* `CacheableNetworkOperation`: avoid unnecessarily creating operations
for cache hits (#2135) via NachoSoto (@NachoSoto)
* `PurchaseTester`: fixed `macOS` support (#2175) via NachoSoto
(@NachoSoto)
* `IntroEligibilityCalculator`: added log including `AppleReceipt`
(#2181) via NachoSoto (@NachoSoto)
* `Purchase Tester`: fixed scene manifest (#2170) via NachoSoto
(@NachoSoto)
* `HTTPClientTests`: refactored to use `waitUntil` (#2168) via NachoSoto
(@NachoSoto)
* `Integration Tests`: split up tests in smaller files (#2158) via
NachoSoto (@NachoSoto)
* `StoreKitRequestFetcher`: removed unnecessary dispatch (#2152) via
NachoSoto (@NachoSoto)
* `Purchase Tester`: added companion `watchOS` app (#2140) via NachoSoto
(@NachoSoto)
* `StoreKit1Wrapper`: added warning if receiving too many updated
transactions (#2117) via NachoSoto (@NachoSoto)
* `StoreKitTestHelpers`: cleaned up unnecessary log (#2177) via
NachoSoto (@NachoSoto)
* `TrialOrIntroPriceEligibilityCheckerSK1Tests`: use `waitUntilValue`
(#2173) via NachoSoto (@NachoSoto)
* `DNSChecker`: added log with resolved host (#2167) via NachoSoto
(@NachoSoto)
* `MagicWeatherSwiftUI`: updated `README` to point to workspace (#2142)
via NachoSoto (@NachoSoto)
* `Purchase Tester`: fixed `.storekit` config file reference (#2171) via
NachoSoto (@NachoSoto)
* `Purchase Tester`: fixed error alerts (#2169) via NachoSoto
(@NachoSoto)
* `CI`: don't make releases until `release-checks` pass (#2162) via
NachoSoto (@NachoSoto)
* `Fastfile`: changed `match` to `readonly` (#2161) via NachoSoto
(@NachoSoto)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants