Malcolm Hall

  • About
  • Research
  • Consultancy
  • Products
    • AppRecorder
    • Apps Using Location
    • Clipboard Monitor
    • Common Rocks Reference
    • Core Location Info
    • Friendify
    • Grape Stomper
    • HomeMenu
    • iBeacon Scanner
    • Insomnia
    • Navigate from Maps
    • Nickname
    • Plate Smasher
    • Plugged In
    • Readster
    • Resize Image
    • Read★
    • ScreenshotMenu
    • Sleep Display
    • SleepFX
    • Stealth Cam
    • TV Tube Sleep
    • UDID Calculator
    • WiFi Booster
    • WiFi Passwords

malhal

SwiftUI

@StateObservable: A property wrapper for using an @Observable class as state without optionals or onAppear

Health warning: In general I would not recommend this approach. View data should be @State simple values or custom structs with mutating func for testable logic, passed down as let for read only, computed vars for transforming, or @Binding var for read/write. @Observable is designed for data models, e.g. loading Read more

By malhal, 2 years21st May 2024 ago
Concurrency

CLMonitor singleton to workaround the “Monitor named is already in use” exception

If you attempt to init another instance of CLMonitor with the same name it crashes with: Since I wanted to use the same monitor from different tasks I needed to turn it into a singleton and came up with this: This allows this kind of thing to work without crashing: Read more

By malhal, 2 years15th May 2024 ago
Concurrency

A simple calculator using @Observable, withObservationTracking and AsyncStream

Following on from my previous post on this topic I found a forum post with someone struggling to build a calculator using @Observable and thought maybe my technique of wrapping withObservationTracking in AsyncStream might help and came up with the code below which appears to work. Obviously this code comes Read more

By malhal, 2 years14th May 2024 ago
Concurrency

Create an AsyncStream from withObservationTracking() function

I needed to create an AsyncStream to monitor changes to an @Observable model class’s var and by using withCheckedContinuation and AsyncStream‘s unfolding init I came up with this: The challenge here is withObservationTracking only watches for a single change but we can wrap that in withCheckedContinuation which also is designed Read more

By malhal, 2 years4th May 2024 ago
SwiftUI

Observable does not conform with Equatable (and Hashable)

I noticed a snag when using NavigationLink(value:label:) and .navigationDestination(for:destination:) with the new @Observable vs the old Combine ObservableObject (which “just worked™️”). There are 2 compilation errors: Fortunately it is relatively simple to add Hashable conformance to an @Observable class by implementing a static func == and a func hash that Read more

By malhal, 2 years23rd April 2024 ago
SwiftUI

@Observable vs ObservableObject in SwiftUI

In SwiftIUI, when requiring the reference semantics of a class and wanting to upgrade from Combine’s ObservableObject and @StateObject to the new @Observable it requires a bit more work to get the life-cycle correct. The reason for this is we have to store the object in @State which is designed Read more

By malhal, 2 years22nd April 2024 ago
Mac

How to clone an Apple Silicon Mac without Migration Assistant or Time Machine

Today I successfully cloned my M1 MacBook Air to a new M3 MacBook Pro, it took some effort so thought I would share the steps here. Before I begin, the reason I prefer to clone rather than use Migration Assistant is I have many command line tools installed all over Read more

By malhal, 2 years17th April 2024 ago
SwiftUI

SwiftUI: Sharing AppStorage across the whole app

Sharing @AppStorage without having to pass it into every feature of the app is simply done in the same way it’s done for anything else you want to share: EnvironmentKey. It lets you share a source of truth into a View hierarchy without needing to pass it into every View. Read more

By malhal, 2 years10th April 2024 ago
Concurrency

Merge different AsyncStream types

When I first used AsyncStream with merge from AsyncAlgorithms I struggled with merging different stream result types and had experimented with building a protocol that each stream’s result type enum implemented. That way all the streams used the same protocol type and could be merged. I realised today that I Read more

By malhal, 2 years18th March 2024 ago
Swift

UISplitViewController collapse code for iOS 14 and later

A new collapse delegate was added in Xcode 12 and iOS 14. Unfortunately the Master-Detail template was removed so there has never been a good example of how to use it to maintain the behavior of the previous template which was to show the master if no detail is showing. Read more

By malhal, 2 years2nd January 2024 ago

Posts pagination

Previous 1 2 3 … 6 Next
Recent Posts
  • How to Expand a Synology SHR‑0 Volume to the Full Size of a New Disk After Converting from SHR‑1
  • How to Convert a Synology SHR‑1 to SHR‑0 (Single-Disk) Using mdadm
  • Understanding context.environment in SwiftUI’s UIViewRepresentable
  • AppleRAID JBOD APFS resize error when trying to add or remove a disk
  • Converting from @StateObject to .task
Recent Comments
  • SwiftUI 2: the way to open view in new window on Open window / scene in SwiftUI 2.0 on macOS
  • Why Does URL Scheme/onOpenURL In SwiftUI Always Open A New Window? - Programming Questions And Solutions Blog on Open window / scene in SwiftUI 2.0 on macOS
  • Ken Carroll on Enabling iOS 9.3 SDK in Xcode 8 for iOS 10
  • Mr WordPress on Welcome to my Developer Blog
Archives
  • November 2025
  • July 2025
  • June 2025
  • February 2025
  • November 2024
  • October 2024
  • July 2024
  • May 2024
  • April 2024
  • March 2024
  • January 2024
  • December 2023
  • October 2023
  • June 2023
  • May 2023
  • April 2023
  • March 2023
  • January 2023
  • November 2022
  • June 2022
  • December 2020
  • May 2018
  • October 2017
  • September 2017
  • August 2017
  • January 2017
  • July 2016
  • May 2016
Categories
  • AppIntents
  • CloudKit
  • Concurrency
  • CoreData
  • CoreLocation
  • Mac
  • MapKit
  • NSOperation
  • Objective-C
  • Swift
  • SwiftData
  • SwiftUI
  • Synology
  • UIKit
  • Uncategorised
  • Xcode
Meta
  • Log in
  • Entries feed
  • Comments feed
  • WordPress.org
Hestia | Developed by ThemeIsle