<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Peter Friese on Medium]]></title>
        <description><![CDATA[Stories by Peter Friese on Medium]]></description>
        <link>https://medium.com/@peterfriese?source=rss-ea0b1eb1f5d2------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*51Uh67ys1teNU72L8hYIEw.png</url>
            <title>Stories by Peter Friese on Medium</title>
            <link>https://medium.com/@peterfriese?source=rss-ea0b1eb1f5d2------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 13 Jun 2026 05:04:45 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@peterfriese/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Register now for Firebase Summit 2022!]]></title>
            <link>https://medium.com/firebase-developers/register-now-for-firebase-summit-2022-4a84f265f08b?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/4a84f265f08b</guid>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Tue, 13 Sep 2022 11:13:39 GMT</pubDate>
            <atom:updated>2022-09-13T20:56:07.137Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xFvvmt4DfP_3uKjBGOjGAA.png" /></figure><p>One of the best things about Firebase is our community, so after three long years, we’re thrilled to announce that our seventh annual <strong>Firebase Summit</strong> is returning as a hybrid event with <em>both</em> in-person <em>and</em> virtual experiences! Our 1-day, in-person event will be held at <strong>Pier 57 in New York City on October 18, 2022</strong>. It will be a fun reunion for us to come together to learn, network, and share ideas. But if you’re unable to travel, don’t worry, you’ll still be able to take part in the activities online from your office/desk/couch wherever you are in the world.</p><p>Join us to learn how Firebase can help you accelerate app development, run your app with confidence, and scale your business. <a href="https://rsvp.withgoogle.com/events/firebase-dev-summit/forms/registration"><strong>Registration is now open</strong></a> for both the physical and virtual events! Read on for more details on what to expect.</p><p><strong>In-person and livestreamed</strong></p><p>We’ll kick off the day with a keynote from our leaders, highlighting all the latest Firebase news and announcements. With these updates, our goal is to give you a seamless and secure development experience that lets you focus on making your app the best it can be.</p><h3>#AskFirebase Live</h3><p><strong>In-person and livestreamed</strong></p><p>Having a burning question you want to ask us? We’ll take questions from our in-person and virtual attendees and answer them live on stage during a special edition of everyone’s favorite, #AskFirebase.</p><h3>Expert-led Classes</h3><p><strong>In-person and will be released later</strong></p><p>You’ve been asking us for more technical deep dives, so this year we’ll also be running expert-led classes at Firebase Summit. These platform-specific classes will be designed to give you comprehensive knowledge and hands-on practice with Firebase products. Initially, these classes will be exclusive to in-person attendees, but we’ll repackage the content for self-paced learning and release them later for our virtual attendees.</p><h3>We can’t wait to see you</h3><p>In addition, Firebase Summit will be full of all the other things you love — interactive demos, lots of networking opportunities, exciting conversations with the community…and a few surprises too! We’ll be sharing more details about Firebase Summit 2022 in the upcoming weeks so stay tuned. In the meantime, <a href="https://rsvp.withgoogle.com/events/firebase-dev-summit/forms/registration">register for the event</a>, subscribe to the <a href="https://www.youtube.com/user/Firebase">Firebase YouTube channel</a>, and follow us on <a href="https://twitter.com/firebase">Twitter</a> and <a href="https://www.linkedin.com/company/firebase/">LinkedIn</a> to join the conversation using #FirebaseSummit.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4a84f265f08b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/firebase-developers/register-now-for-firebase-summit-2022-4a84f265f08b">Register now for Firebase Summit 2022!</a> was originally published in <a href="https://medium.com/firebase-developers">Firebase Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Calling asynchronous Firebase APIs from Swift]]></title>
            <link>https://medium.com/firebase-developers/calling-asynchronous-firebase-apis-from-swift-757e8207df54?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/757e8207df54</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[firebase]]></category>
            <category><![CDATA[swift-async-await]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Wed, 02 Feb 2022 14:23:25 GMT</pubDate>
            <atom:updated>2022-02-02T14:23:25.581Z</atom:updated>
            <content:encoded><![CDATA[<h4>Fundamentals</h4><h4>How to use Callbacks, Combine, and async/await</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Um3VykF0-vfJulIu.png" /></figure><p>Most of Firebase’s APIs are asynchronous.</p><p>This might be confusing at first: you’re making a call, for example to fetch some data from Firestore, but you don’t get a result back.</p><p>Why does this happen, what does “asynchronous API” mean, and how do you even call asynchronous APIs in Swift?</p><p>If you’ve been asking yourself these questions, you’re not alone — quite literally, these are some of the most frequently asked questions about Firebase on StackOverflow and on our GitHub repos.</p><p>In this post, I am going to explain what this all means, and show you three easy ways to call Firebase’s APIs asynchronously from your Swift / SwiftUI app.</p><h3>“Can I please get a skinny latte, extra-hot”</h3><p>To understand the nature of asynchronous APIs, let’s imagine we’re at a coffee bar, and you’ve just placed your order. The barista has just turned around to get the skimmed milk and starts preparing your drink.</p><p>While you’re waiting for your drink, you could either chat to another person in the queue, or check your phone for any important news. So you turn around to me to strike up a conversation about the weather or the latest rumours about that M2 MacBook.</p><p>Once the barista has finished preparing your drink, they hand it over to you:</p><p>“Anything else?”</p><p>“No, thanks”</p><p>“That’ll be 2.49 then”</p><p>You pay, and the barista turns to the next person.</p><p>We’ve just experienced an asynchronous process: while the barista was busy preparing your drink, you didn’t have to stand still, holding your breath. That would’ve been pretty uncomfortable indeed. No, you were able to breathe normally, and even have a conversation with me.</p><h3>Asynchronous APIs</h3><p>The same applies to our apps: we don’t want the foreground process (which drives UI updates) to freeze while the app is waiting for the server to return the result of a network request. Maybe you’ve experienced this in some apps before, and lost your patience after a few seconds. When this happens, users usually either leave or kill the app. And we don’t want that to happen.</p><p>This is why many APIs that might take a bit longer are implemented asynchronously: you call them, and they immediately return control back to the caller while they start their own processing in the background. Once they finish, they will call back to the original caller. Just like in the example with the coffee bar.</p><p>Now, in a coffee bar, the barista knows who they need to get back to, as they either took your name, or they remember your face, or you’re still standing at the counter.</p><p>But how does this work in our apps? Let’s look at three different ways how you can call asynchronous APIs:</p><ul><li>callbacks</li><li>Combine</li><li>async/wait</li></ul><h3>Using callbacks to call asynchronous APIs</h3><p>Callbacks are probably the most commonly used way to implement asynchronous APIs, and you very likely already used them in your code. They’ve been around since the days of Objective-C (when they were called <em>completion blocks)</em>. In Swift, we use closures to implement callbacks.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/115282838c58605daedd42bfd26bab7c/href">https://medium.com/media/115282838c58605daedd42bfd26bab7c/href</a></iframe><p>Swift has always supported trailing closures, making it even more elegant to use callbacks in Swift. Here’s how the above code looks like when using trailing closure syntax:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b0eacfc2eff7b87f382feb6415d4fac0/href">https://medium.com/media/b0eacfc2eff7b87f382feb6415d4fac0/href</a></iframe><p>Notice how we were able to remove the parameter label and move the closing parenthesis right after the first parameter. This makes the code much easier to read, especially for closures that span several lines.</p><blockquote><strong><em>Internal DSLs</em></strong></blockquote><blockquote><em>Being able to write code like this almost makes the function call look like it’s part of the language. The use of trailing closures is one of the key enablers for SwiftUIs DSL, and the reason why it feels so natural for writing UI code. SwiftUI is an internal DSL — it is written in the host language, making it easier to integrate in existing toolchains, and easier to learn for developers who are already used to the host language.</em></blockquote><blockquote><em>For more details, see Martin Fowler’s article on </em><a href="https://martinfowler.com/bliki/InternalDslStyle.html"><em>internal DSLs</em></a><em>.</em></blockquote><p>To see this in action, let’s look at one of Firebase’s APIs. Here is a call to signIn(withEmail:password:) :</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2434752a4cc57624f5b3ea8adf9105d8/href">https://medium.com/media/2434752a4cc57624f5b3ea8adf9105d8/href</a></iframe><p>Let’s discuss some of the key aspects of this code:</p><ol><li>In this code snippet, I use a trailing closure to call signIn(withEmail:password:). If you look at the method signature, you will notice there is a third parameter, completion: . Thanks to Swift&#39;s trailing closure syntax, we can move this parameter out of the call signature and append the closure at the end of the call, outside of the parenthesis. This makes it more fluent, and pleasing to the eye.</li><li>When running the code, the console output will look like this:</li></ol><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f644c02c430fff8d8300d0d3a4c071fc/href">https://medium.com/media/f644c02c430fff8d8300d0d3a4c071fc/href</a></iframe><p>3. Once the print statement at the end of the function has been executed, the function will be left. If you try to access self.isSignedIn at this moment, it will still be false. Only once the user has completed the sign-in flow, and the closure has been called, the property isSignedIn will be true.</p><h3>Calling asynchronous APIs using Combine</h3><p>Combine is Apple’s reactive framework for handling asynchronous events. It provides a declarative API for describing how events (such as user input or network responses) should be handled.</p><p>Firebase supports Combine for some of its key APIs (such as Firebase Authentication, Cloud Firestore, Cloud Functions, and Cloud Storage).</p><p>To use Combine for Firebase, add the respective module to your target (e.g. FirebaseAuthCombine-Community) and import it.</p><p>Here’s how you can use Combine to call the signIn(withEmail:password:) method.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/bfd3888452e434235e1a37c268268580/href">https://medium.com/media/bfd3888452e434235e1a37c268268580/href</a></iframe><p>Notice how the first part of the call is virtually the same as the one we used in the previous section. This is on purpose, to make it easier to switch from one way of calling Firebase’s asynchronous APIs to another.</p><p>In the next steps, we:</p><ul><li>extract the user object using Combine&#39;s map operator (2)</li><li>handle errors by replacing them with a nil value (3)</li><li>check if the value is nil, and return true if the user object is set (4)</li></ul><p>Finally, we assign the result (a Bool indicating whether the user has successfully signed in) to the isSignedIn property of our view model (5). As this is a publisher property, assigning a value to it will trigger SwiftUI to redraw the UI.</p><p>This code is much more compact and concise than the one we had to write when using callbacks. Instead of having to telling Swift <em>how</em> to process the network request and its response, Combine’s declarative programming model allows us to describe <em>what</em> we want to do.</p><p>Using a declarative framework for describing the data flow in your app (Combine) aligns nicely with using a declarative framework for describing the UI of your app (SwiftUI).</p><h3>Calling APIs asynchronously using async/await</h3><p>The final (and probably most elegant) way to call asynchronous APIs is async/ await . This is a new language feature introduced in Swift 5.5 that allows us to call asynchronous code and <em>suspend</em> the current thread until the called code returns.</p><p>Let’s see how we can call signIn(withEmail:password:) using async/await:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f13ea7c2952ad67786474cbca7beb874/href">https://medium.com/media/f13ea7c2952ad67786474cbca7beb874/href</a></iframe><ol><li>We need to prefix the call to signIn(withEmail:password:) with await to indicate we want to call this method asynchronously. Notice that we don&#39;t have to provide a closure - using await will suspend the thread and resume execution once the user has signed in our the process has failed for some reason. While the thread is suspended, the app&#39;s foreground thread continues to handle events, so the app will not freeze.</li><li>Using await makes our function asynchronous. To let callers know about this, we need to mark it with the async keyword. The compiler will make sure that this function is only called from another asynchronous context. More about this in a moment.</li><li>Since the call to signIn(withEmail:password:) can throw an exception, we need to wrap the entire call in a do/try/catch block (3, 4).</li><li>When assigning the result of the call to the isSignedIn property on our view model, we need to make sure this happens on the main thread. Instead of wrapping this assignment in a call to DispatchQueue.main.async { }, we can use the @MainActor attribute to make sure the entire function is being executed on the main thread (5).</li></ol><p>The good news is that you can use async/await in your apps targeting iOS 13 and up — see the <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-13_2-release-notes#Swift">release notes</a> for Xcode 13.2:</p><blockquote><em>You can now use Swift Concurrency in applications that deploy to macOS Catalina 10.15, iOS 13, tvOS 13, and watchOS 6 or newer. This support includes </em><em>async/ </em><em>await, actors, global actors, structured concurrency, and the task APIs. (70738378)</em></blockquote><p>Almost all of Firebase’s asynchronous calls are ready for async/await, with a few exceptions that we’re currently fixing. Should you run into any method that you can’t seem to call using async/await, check out our <a href="https://github.com/firebase/firebase-ios-sdk/issues">issue tracker</a> to see if we’re working on it already. If not, file an issue and we will look into it.</p><h3>Closure</h3><p>Making sure our apps run snappy and perform smoothly even when performing heavy duty tasks on the network is a top priority for us, no matter which platforms we’re targeting.</p><p>By providing asynchronous APIs, SDKs like Firebase and others ensure that developers can rely on a coherent and consistent programming model. This allows developers to focus on what they care about most: delivering value to their users and inspiring them with great experiences and snappy UIs.</p><p>In this post, I’ve walked you through the three most common ways you can use to access Firebase APIs asynchronously on Apple’s platforms.</p><p>As a rule of thumb, check the signature of the method you want to call. If its last parameter is a completion handler (most commonly named completion), you&#39;re dealing with an asynchronous method that you can call with any one of the techniques described in this article.</p><p>If you’re curious how this works in other languages, check out Doug’s article: <a href="https://medium.com/p/e037a6654a93">Why are the Firebase API asynchronous?</a></p><p>Thanks for reading! 🔥</p><p><em>Originally published at </em><a href="https://peterfriese.dev/posts/firebase-async-calls-swift/"><em>https://peterfriese.dev</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=757e8207df54" width="1" height="1" alt=""><hr><p><a href="https://medium.com/firebase-developers/calling-asynchronous-firebase-apis-from-swift-757e8207df54">Calling asynchronous Firebase APIs from Swift</a> was originally published in <a href="https://medium.com/firebase-developers">Firebase Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Networking With Combine and SwiftUI]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/networking-with-combine-and-swiftui-fdf8182f7360?source=rss-ea0b1eb1f5d2------2"><img src="https://cdn-images-1.medium.com/max/1440/0*BwtcquhhSXo07rur.png" width="1440"></a></p><p class="medium-feed-snippet">Perform networking calls using reactive programming</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/networking-with-combine-and-swiftui-fdf8182f7360?source=rss-ea0b1eb1f5d2------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/networking-with-combine-and-swiftui-fdf8182f7360?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/fdf8182f7360</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Wed, 19 Jan 2022 17:21:05 GMT</pubDate>
            <atom:updated>2022-01-19T17:21:05.041Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Using SwiftUI View Modifiers to Display Empty State]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/using-swiftui-view-modifiers-to-display-empty-state-5145f220de56?source=rss-ea0b1eb1f5d2------2"><img src="https://cdn-images-1.medium.com/max/1440/1*JgFBhh0b97mnx9Hm2E916Q.png" width="1440"></a></p><p class="medium-feed-snippet">Create meaningful empty states</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/using-swiftui-view-modifiers-to-display-empty-state-5145f220de56?source=rss-ea0b1eb1f5d2------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/using-swiftui-view-modifiers-to-display-empty-state-5145f220de56?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/5145f220de56</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Tue, 14 Dec 2021 15:06:04 GMT</pubDate>
            <atom:updated>2021-12-14T15:06:04.827Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Confirmation Dialogs in SwiftUI]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/confirmation-dialogs-in-swiftui-63758a57da5c?source=rss-ea0b1eb1f5d2------2"><img src="https://cdn-images-1.medium.com/max/1440/1*VG6582mmtdQ0ULCOR1NHzw.png" width="1440"></a></p><p class="medium-feed-snippet">Replicating Apple&#x2019;s Reminders app</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/confirmation-dialogs-in-swiftui-63758a57da5c?source=rss-ea0b1eb1f5d2------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/confirmation-dialogs-in-swiftui-63758a57da5c?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/63758a57da5c</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Mon, 13 Dec 2021 14:03:22 GMT</pubDate>
            <atom:updated>2021-12-13T14:04:05.154Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Managing Focus in SwiftUI List Views]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/managing-focus-in-swiftui-list-views-286b139e6bca?source=rss-ea0b1eb1f5d2------2"><img src="https://cdn-images-1.medium.com/max/1920/0*fTWKi8a55zJr1nHo.gif" width="1920"></a></p><p class="medium-feed-snippet">A look at FocusState&#x200A;&#x2014;&#x200A;the new property wrapper introduced with iOS 15</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/managing-focus-in-swiftui-list-views-286b139e6bca?source=rss-ea0b1eb1f5d2------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/managing-focus-in-swiftui-list-views-286b139e6bca?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/286b139e6bca</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[ux]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[swiftui]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Tue, 09 Nov 2021 15:07:22 GMT</pubDate>
            <atom:updated>2021-11-09T15:07:22.295Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Building Dynamic Lists in SwiftUI for iOS 15]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/building-dynamic-lists-in-swiftui-for-ios-15-a2e470fb37cb?source=rss-ea0b1eb1f5d2------2"><img src="https://cdn-images-1.medium.com/max/2600/0*K6O4-VGRzrvwxx3n" width="4676"></a></p><p class="medium-feed-snippet">Enhance your SwiftUI List Views</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/building-dynamic-lists-in-swiftui-for-ios-15-a2e470fb37cb?source=rss-ea0b1eb1f5d2------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/building-dynamic-lists-in-swiftui-for-ios-15-a2e470fb37cb?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/a2e470fb37cb</guid>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Thu, 09 Sep 2021 17:01:46 GMT</pubDate>
            <atom:updated>2021-09-09T17:01:46.572Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Customizing Views Inside SwiftUI Lists]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/customizing-views-inside-swiftui-lists-7b2cacdd9fd0?source=rss-ea0b1eb1f5d2------2"><img src="https://cdn-images-1.medium.com/max/2600/0*y2dhXxyDX8In-0w5" width="5760"></a></p><p class="medium-feed-snippet">Everything you need to know about SwiftUI&#x2019;s list views</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/customizing-views-inside-swiftui-lists-7b2cacdd9fd0?source=rss-ea0b1eb1f5d2------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/customizing-views-inside-swiftui-lists-7b2cacdd9fd0?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/7b2cacdd9fd0</guid>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Tue, 31 Aug 2021 13:33:02 GMT</pubDate>
            <atom:updated>2021-08-31T13:33:02.954Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[SwiftUI Concurrency: Understand Cooperative Task Cancellation]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/swiftui-concurrency-understand-cooperative-task-cancellation-b71cc69483e0?source=rss-ea0b1eb1f5d2------2"><img src="https://cdn-images-1.medium.com/max/1440/1*4EPGrZuIipmOLx0MiGMPcg.png" width="1440"></a></p><p class="medium-feed-snippet">Cancelling tasks just got a whole lot easier</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/swiftui-concurrency-understand-cooperative-task-cancellation-b71cc69483e0?source=rss-ea0b1eb1f5d2------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/swiftui-concurrency-understand-cooperative-task-cancellation-b71cc69483e0?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/b71cc69483e0</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[concurrency]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Thu, 15 Jul 2021 16:11:54 GMT</pubDate>
            <atom:updated>2021-07-15T16:11:54.919Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Getting Started With Async/Await in SwiftUI for iOS 15]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/getting-started-with-async-await-in-swiftui-for-ios-15-f627eb722a4b?source=rss-ea0b1eb1f5d2------2"><img src="https://cdn-images-1.medium.com/max/1440/0*0gEOdEVmo1Nt0H0Q.png" width="1440"></a></p><p class="medium-feed-snippet">Learn how to use async/await in SwiftUI apps</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/getting-started-with-async-await-in-swiftui-for-ios-15-f627eb722a4b?source=rss-ea0b1eb1f5d2------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/getting-started-with-async-await-in-swiftui-for-ios-15-f627eb722a4b?source=rss-ea0b1eb1f5d2------2</link>
            <guid isPermaLink="false">https://medium.com/p/f627eb722a4b</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Peter Friese]]></dc:creator>
            <pubDate>Wed, 30 Jun 2021 16:02:28 GMT</pubDate>
            <atom:updated>2021-06-30T16:02:28.966Z</atom:updated>
        </item>
    </channel>
</rss>