SwiftData 如何在 Widgets 和 App 的界面之间同步数据变化?

在这里插入图片描述

概述

从 iOS 17(watchOS 11)开始,苹果推出了可交互小组件(Interactive Widgets),使用它我们终于能在 Widgets 中添加按钮或 Toggle 来直接驱动数据的变化了。

在这里插入图片描述

但是被 Widgets 修改的数据如何及时的同步到对应 App 的界面中呢?

相信学完本篇之后,小伙伴们对于 SwiftData 数据变化在 Widgets 和 App 界面间的同步处理一定会了然于胸!

那还等什么呢?Let’s go!!!😉


1. 打造 Widgets 和 App 中共享的 ModelContainer 容器

首先,为了能在 Widgets 和 App 里共享同一个持久存储数据库,我们必须采用某种机制让它们“航行在同一片海域”。

对于 Apple 平台来说,最简单的方法是使用 CoreData 或 SwiftData 的组件共享机制。比如,App Groups 或 iCloud。这里,因为我们不需要跨设备同步数据,所以采用 SwiftData + App Groups 的搭档方式。

第一步,我们需要在 Xcode 中为 Target 增加 App Groups Capability,我们还要选择一个以 group. 开头的唯一 Groups ID 名称:

在这里插入图片描述

接着,创建一个新的 ModelContainer+ext.swift 源代码文件:

import SwiftData

enum Common {
   
    static let appGroupID = "group.YourAppName.YourName.com"
}

extension ModelContainer {
   
    // 所有需要加入 ModelContainer 容器中的托管数据类型
    private static let schema = Schema([
        AppModel.self,
        TemptingRecord.self,
        InternalStorageClock.self,
        Settings.self,
    ])
        
    static var used: ModelContainer = {
   
        ProcessInfo.processInfo.isRunningInPreviews ? .preview : .shared
    }()
    
    static var shared: ModelContainer = {
   
        
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false, groupContainer: .identifier(Common.appGroupID))
    
        do {
   
            return try ModelContainer(for: schema, configurations: [modelConfiguration])
        } catch {
   
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()

    static var preview: 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值