@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +266 -267
- package/package.json +2 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/skills/.skill-manifest.json +68 -68
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
|
@@ -1,28 +1,21 @@
|
|
|
1
|
-
# Bridging and
|
|
1
|
+
# Bridging Callbacks, Delegates and GCD
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Checked continuations
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`withCheckedContinuation` (non-throwing) and `withCheckedThrowingContinuation`
|
|
6
|
+
(throwing) turn a completion-handler API into an async function. Both are
|
|
7
|
+
available from iOS 13. Documentation:
|
|
6
8
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
- [GCD Migration](#gcd-migration)
|
|
10
|
-
|
|
11
|
-
## Checked Continuations
|
|
12
|
-
|
|
13
|
-
Use `withCheckedContinuation` (non-throwing) or `withCheckedThrowingContinuation` (throwing) to bridge completion-handler APIs into async/await. Available iOS 13+.
|
|
14
|
-
|
|
15
|
-
Docs: [withCheckedContinuation](https://sosumi.ai/documentation/swift/withcheckedcontinuation(isolation:function:_:)) · [withCheckedThrowingContinuation](https://sosumi.ai/documentation/swift/withcheckedthrowingcontinuation(isolation:function:_:))
|
|
16
|
-
|
|
17
|
-
### Basic Pattern
|
|
9
|
+
- https://developer.apple.com/documentation/swift/withcheckedcontinuation(isolation:function:_:)
|
|
10
|
+
- https://developer.apple.com/documentation/swift/withcheckedthrowingcontinuation(isolation:function:_:)
|
|
18
11
|
|
|
19
12
|
```swift
|
|
20
|
-
func
|
|
13
|
+
func fetchQuote(for symbol: String) async throws -> Quote {
|
|
21
14
|
try await withCheckedThrowingContinuation { continuation in
|
|
22
|
-
|
|
15
|
+
legacyMarket.requestQuote(symbol) { result in
|
|
23
16
|
switch result {
|
|
24
|
-
case .success(let
|
|
25
|
-
continuation.resume(returning:
|
|
17
|
+
case .success(let quote):
|
|
18
|
+
continuation.resume(returning: quote)
|
|
26
19
|
case .failure(let error):
|
|
27
20
|
continuation.resume(throwing: error)
|
|
28
21
|
}
|
|
@@ -33,118 +26,180 @@ func fetchData() async throws -> Data {
|
|
|
33
26
|
|
|
34
27
|
### Rules
|
|
35
28
|
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
|
|
29
|
+
- Resume exactly once.
|
|
30
|
+
- Never resuming leaves the awaiting task suspended forever: a leak that no
|
|
31
|
+
error reports.
|
|
32
|
+
- Resuming twice traps at run time.
|
|
33
|
+
- Use checked continuations by default; they detect both mistakes and log
|
|
34
|
+
diagnostics. `withUnsafeContinuation` is for measured hot paths whose
|
|
35
|
+
correctness is already established.
|
|
36
|
+
- The continuation outlives the closure it was handed to, so every exit path,
|
|
37
|
+
including errors and cancellation, must resume it.
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
## Bridging a delegate
|
|
40
|
+
|
|
41
|
+
Store the continuation, resume it from the delegate callbacks, and clear it
|
|
42
|
+
after resuming so it cannot be resumed again.
|
|
41
43
|
|
|
42
44
|
```swift
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
import CoreLocation
|
|
46
|
+
|
|
47
|
+
@MainActor
|
|
48
|
+
final class OneShotLocator: NSObject, @preconcurrency CLLocationManagerDelegate {
|
|
45
49
|
private let manager = CLLocationManager()
|
|
50
|
+
private var pending: CheckedContinuation<CLLocation, any Error>?
|
|
51
|
+
|
|
52
|
+
override init() {
|
|
53
|
+
super.init()
|
|
54
|
+
manager.delegate = self
|
|
55
|
+
}
|
|
46
56
|
|
|
47
|
-
func
|
|
57
|
+
func currentLocation() async throws -> CLLocation {
|
|
48
58
|
try await withCheckedThrowingContinuation { continuation in
|
|
49
|
-
|
|
50
|
-
manager.delegate = self
|
|
59
|
+
pending = continuation
|
|
51
60
|
manager.requestLocation()
|
|
52
61
|
}
|
|
53
62
|
}
|
|
54
63
|
|
|
55
64
|
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
|
|
56
|
-
|
|
57
|
-
|
|
65
|
+
guard let first = locations.first else { return }
|
|
66
|
+
pending?.resume(returning: first)
|
|
67
|
+
pending = nil
|
|
58
68
|
}
|
|
59
69
|
|
|
60
|
-
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
func locationManager(_ manager: CLLocationManager, didFailWithError error: any Error) {
|
|
71
|
+
pending?.resume(throwing: error)
|
|
72
|
+
pending = nil
|
|
63
73
|
}
|
|
64
74
|
}
|
|
65
75
|
```
|
|
66
76
|
|
|
67
|
-
|
|
77
|
+
The `@preconcurrency` conformance lets the Objective-C delegate protocol be
|
|
78
|
+
satisfied by main-actor methods and checks at run time that the callbacks
|
|
79
|
+
really arrive on the main thread, which is where a manager created on the main
|
|
80
|
+
thread delivers them.
|
|
81
|
+
|
|
82
|
+
## Passing cancellation through
|
|
83
|
+
|
|
84
|
+
Keep a handle to the legacy operation and cancel it from `onCancel`:
|
|
68
85
|
|
|
69
86
|
```swift
|
|
70
|
-
func
|
|
71
|
-
|
|
87
|
+
func downloadReport(id: String) async throws -> Data {
|
|
88
|
+
let handle = ReportRequestHandle()
|
|
89
|
+
return try await withTaskCancellationHandler {
|
|
72
90
|
try await withCheckedThrowingContinuation { continuation in
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
case .success(let data): continuation.resume(returning: data)
|
|
76
|
-
case .failure(let error): continuation.resume(throwing: error)
|
|
77
|
-
}
|
|
91
|
+
handle.request = legacyReports.download(id: id) { result in
|
|
92
|
+
continuation.resume(with: result)
|
|
78
93
|
}
|
|
79
|
-
// Store task for cancellation
|
|
80
94
|
}
|
|
81
95
|
} onCancel: {
|
|
82
|
-
|
|
96
|
+
handle.request?.cancel()
|
|
83
97
|
}
|
|
84
98
|
}
|
|
85
99
|
```
|
|
86
100
|
|
|
87
|
-
|
|
101
|
+
`ReportRequestHandle` is a small `Sendable` box (for example a final class with
|
|
102
|
+
a `Mutex`-protected property) because `onCancel` can run on any thread. The
|
|
103
|
+
legacy API must still call its completion with a cancellation error so the
|
|
104
|
+
continuation resumes.
|
|
105
|
+
|
|
106
|
+
## Streams from repeating callbacks
|
|
88
107
|
|
|
89
|
-
For
|
|
108
|
+
For sources that produce many values over time, such as delegates or
|
|
109
|
+
`NotificationCenter`, build an `AsyncStream`:
|
|
90
110
|
|
|
91
111
|
```swift
|
|
112
|
+
@MainActor
|
|
92
113
|
func locationUpdates() -> AsyncStream<CLLocation> {
|
|
93
114
|
AsyncStream { continuation in
|
|
94
|
-
let
|
|
115
|
+
let feed = LocationFeed { continuation.yield($0) }
|
|
95
116
|
continuation.onTermination = { _ in
|
|
96
|
-
|
|
117
|
+
Task { @MainActor in feed.stop() }
|
|
97
118
|
}
|
|
98
|
-
|
|
119
|
+
feed.start()
|
|
99
120
|
}
|
|
100
121
|
}
|
|
101
122
|
```
|
|
102
123
|
|
|
103
|
-
|
|
124
|
+
`LocationFeed` is a `@MainActor` delegate object like `OneShotLocator` that
|
|
125
|
+
calls its closure from `didUpdateLocations` and starts or stops updates on its
|
|
126
|
+
manager. Setting `onTermination` stops the source
|
|
127
|
+
when the consumer stops iterating or its task is cancelled.
|
|
128
|
+
|
|
129
|
+
## Replacing GCD
|
|
130
|
+
|
|
131
|
+
This table applies the rule in SKILL.md, "Choosing how code moves between
|
|
132
|
+
contexts": prefer isolation written in declarations, use a dynamic hop only
|
|
133
|
+
when a declaration cannot express it, and keep Dispatch only where an API
|
|
134
|
+
insists on a queue.
|
|
135
|
+
|
|
136
|
+
| GCD | Preferred replacement | Fallback, with its reason |
|
|
137
|
+
|---|---|---|
|
|
138
|
+
| `DispatchQueue.main.async { }` | `@MainActor` on the function, type or closure | `Task { @MainActor in }` from synchronous code; `await MainActor.run { }` for one batch inside an async function that must stay `nonisolated` |
|
|
139
|
+
| `DispatchQueue.global().async { }` | A `@concurrent` async function (Swift 6.2) | `Task { }` when inheriting the caller is fine; `Task.detached { }` only to shed actor, priority and task-locals on purpose |
|
|
140
|
+
| `DispatchGroup` | `async let` or a task group | |
|
|
141
|
+
| `DispatchSemaphore` | Actor isolation, or an `AsyncStream` to hand values between tasks | |
|
|
142
|
+
| `DispatchWorkItem` with `cancel()` | A stored `Task` and `task.cancel()` | |
|
|
143
|
+
| Serial `DispatchQueue` guarding state | An `actor` | A `Mutex` when callers are synchronous |
|
|
144
|
+
| `DispatchQueue.concurrentPerform` | `withTaskGroup` | |
|
|
145
|
+
| `DispatchSource.makeTimerSource` | A loop around `try await Task.sleep(for:)`, or a `Clock` | |
|
|
146
|
+
| A queue required by an API (`NWConnection.start(queue:)`, capture output delegates) | Keep the queue; enter isolation immediately in the callback | Make the queue the executor of a custom actor via `DispatchSerialQueue` (iOS 17) |
|
|
104
147
|
|
|
105
|
-
|
|
106
|
-
| --- | --- |
|
|
107
|
-
| `DispatchQueue.main.async { }` | `@MainActor` isolation or `MainActor.run { }` |
|
|
108
|
-
| `DispatchQueue.global().async { }` | `Task { }` or `Task.detached { }` (Swift 6.2: `@concurrent`) |
|
|
109
|
-
| `DispatchGroup` | `async let` or `TaskGroup` |
|
|
110
|
-
| `DispatchSemaphore` | Actor isolation or `AsyncStream` |
|
|
111
|
-
| `DispatchWorkItem` with cancel | `Task` with `task.cancel()` |
|
|
112
|
-
| `DispatchQueue` serial queue | `actor` |
|
|
113
|
-
| `DispatchQueue.concurrentPerform` | `withTaskGroup` |
|
|
114
|
-
| `DispatchSource.makeTimerSource` | `Task.sleep(for:)` in a loop, or `Clock` |
|
|
148
|
+
### Group to task group
|
|
115
149
|
|
|
116
|
-
|
|
150
|
+
Before:
|
|
117
151
|
|
|
118
152
|
```swift
|
|
119
|
-
// Before (GCD)
|
|
120
153
|
let group = DispatchGroup()
|
|
121
|
-
|
|
154
|
+
var pages: [Data] = []
|
|
155
|
+
for url in pageURLs {
|
|
122
156
|
group.enter()
|
|
123
|
-
|
|
157
|
+
fetchPage(url) { data in
|
|
158
|
+
if let data { pages.append(data) } // unsynchronized append
|
|
159
|
+
group.leave()
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
group.notify(queue: .main) { self.show(pages) }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
After:
|
|
166
|
+
|
|
167
|
+
```swift
|
|
168
|
+
let pages = await withTaskGroup(of: Optional<Data>.self, returning: [Data].self) { group in
|
|
169
|
+
for url in pageURLs {
|
|
170
|
+
group.addTask { try? await fetchPage(url) }
|
|
171
|
+
}
|
|
172
|
+
var collected: [Data] = []
|
|
173
|
+
for await case let page? in group {
|
|
174
|
+
collected.append(page)
|
|
175
|
+
}
|
|
176
|
+
return collected
|
|
124
177
|
}
|
|
125
|
-
|
|
178
|
+
show(pages)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Serial queue to actor
|
|
182
|
+
|
|
183
|
+
Before:
|
|
126
184
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
185
|
+
```swift
|
|
186
|
+
final class TokenStore {
|
|
187
|
+
private let queue = DispatchQueue(label: "token-store")
|
|
188
|
+
private var tokens: [String: String] = [:]
|
|
189
|
+
|
|
190
|
+
func save(_ token: String, for account: String) {
|
|
191
|
+
queue.async { self.tokens[account] = token }
|
|
131
192
|
}
|
|
132
|
-
return await group.reduce(into: [Data]()) { if let d = $1 { $0.append(d) } }
|
|
133
193
|
}
|
|
134
|
-
updateUI(results)
|
|
135
194
|
```
|
|
136
195
|
|
|
137
|
-
|
|
196
|
+
After:
|
|
138
197
|
|
|
139
198
|
```swift
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
actor Cache {
|
|
146
|
-
private var storage: [String: Data] = [:]
|
|
147
|
-
func set(_ key: String, _ value: Data) { storage[key] = value }
|
|
148
|
-
func get(_ key: String) -> Data? { storage[key] }
|
|
199
|
+
actor TokenStore {
|
|
200
|
+
private var tokens: [String: String] = [:]
|
|
201
|
+
|
|
202
|
+
func save(_ token: String, for account: String) { tokens[account] = token }
|
|
203
|
+
func token(for account: String) -> String? { tokens[account] }
|
|
149
204
|
}
|
|
150
205
|
```
|