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: 
  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
在QT5 中,可以使用 `QThread` 类来创建子线程。在子线程中,可以使用信号与槽机制来与主线程进行通信。 以下是一个示例代码,演示了如何在主线程和子线程之间交换图片数据: ```python from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtGui import QImage from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout import time class ImageThread(QThread): # 定义一个信号,用于传递图片数据 image_data = pyqtSignal(QImage) def __init__(self, parent=None): super(ImageThread, self).__init__(parent) def run(self): # 模拟耗时操作 time.sleep(5) # 加载图片 image = QImage('image.jpg') # 发送信号,传递图片数据 self.image_data.emit(image) class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) # 创建标签,用于显示图片 self.label = QLabel(self) self.label.setAlignment(Qt.AlignCenter) self.label.setText('Loading image...') # 创建布局,并将标签添加到布局中 layout = QVBoxLayout(self) layout.addWidget(self.label) # 创建子线程,并将信号与槽连接起来 self.thread = ImageThread(self) self.thread.image_data.connect(self.show_image) # 启动子线程 self.thread.start() def show_image(self, image): # 在标签中显示图片 self.label.setPixmap(QPixmap.fromImage(image)) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在上面的代码中,我们创建了一个 `ImageThread` 类,继承自 `QThread` 类。在 `run()` 方法中,我们模拟了一个耗时的操作,并加载了一张图片。然后,我们通过 `image_data` 信号,将图片数据传递给主线程。 在 `MainWindow` 类中,我们创建了一个标签,用于显示图片。然后,我们创建了一个 `ImageThread` 对象,并将其 `image_data` 信号与 `show_image()` 槽连接起来。最后,我们启动了子线程,并在 `show_image()` 方法中将图片显示在标签中。 注意,由于 `QImage` 和 `QPixmap` 在不同的线程之间传递时可能会出现问题,因此我们在 `show_image()` 方法中使用了 `QPixmap.fromImage()` 方法将图片转换为 `QPixmap` 对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大熊猫侯佩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值