[swift-evolution] [Concurrency] A slightly different perspective
Wallacy
wallacyf at gmail.com
Mon Sep 4 14:54:49 CDT 2017
Yes, maybe in this way... Or using dispatch_group..
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(0, 0), ^ {
// loadWebResource});
dispatch_group_async(group,dispatch_get_global_queue(0, 0), ^ {
// loadWebResource});
dispatch_group_notify(group,dispatch_get_global_queue(0, 0), ^ {
// decodeImage ... etc...});
Can be made using different strategies, the compiler will select the best
fit for every case. Different runtimes, has different "best" strategies
also. No need to use a intermediary type.
Em seg, 4 de set de 2017 às 14:53, Michel Fortin <michel.fortin at michelf.ca>
escreveu:
>
> > Le 4 sept. 2017 à 10:01, Wallacy via swift-evolution <
> swift-evolution at swift.org> a écrit :
> >
> > func processImageData1a() async ->
> > Image {
> > let dataResource = async loadWebResource("dataprofile.txt")
> > let imageResource = async loadWebResource("imagedata.dat")
> >
> > // ... other stuff can go here to cover load latency...
> >
> > let imageTmp = await decodeImage(dataResource, imageResource) //
> compiler error if await is not present.
> > let imageResult = await dewarpAndCleanupImage(imageTmp)
> > return imageResult
> > }
> >
> >
> > If this (or something like that) is not implemented, people will create
> several versions to solve the same problem, so that later (Swift 6?) will
> be solved (because people want this), and we will live with several bad
> codes to maintain.
>
> Just to be sure of what you are proposing, am I right to assume this would
> be compiled down to something like this?
>
> func processImageData1a(completion: (Image) -> ()) {
> var dataResource: Resource? = nil
> var imageResource: Resource? = nil
> var finishedBody = false
>
> func continuation() {
> // only continue once everything is ready
> guard finishedBody else { return }
> guard dataResource = dataResource else { return }
> guard imageResource = imageResource else { return }
>
> // everything is ready now
> decodeImage(dataResource, imageResource) { imageTmp in
> dewarpAndCleanupImage(imageTmp) { imageResult in
> completion(imageResult)
> }
> }
> }
>
> loadWebResource("dataprofile.txt") { result in
> dataResource = result
> continuation()
> }
> loadWebResource("imagedata.dat") { result in
> imageResource = result
> continuation()
> }
>
> // ... other stuff can go here to cover load latency...
>
> finishedBody = true
> continuation()
> }
>
>
> This seems more lightweight than a future to me. I know I've used this
> pattern a few times. What I'm not sure about is how thrown errors would
> work. Surely you want error handling to work when loading resources from
> the web.
>
>
> --
> Michel Fortin
> https://michelf.ca
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170904/02882ca5/attachment.html>
More information about the swift-evolution
mailing list