SwiftUI开发中MJPEG视频流无法更新视图内Image组件问题咨询
问题根因
@Published 属性包装器仅会在属性本身被重新赋值时触发 ObservableObject 的变更通知。你当前代码中:
MJPEGStream类中@Published修饰的stream是引用类型的MJPEGStreamLib实例,运行过程中stream的引用地址没有发生变化,仅修改其内部的image属性不会触发@Published的更新通知MJPEGStreamLib的image属性没有任何发布机制,内部更新后外部无法感知,因此View不会刷新
最简修复方案
步骤1:改造MJPEGStreamLib支持变更发布
让MJPEGStreamLib遵守ObservableObject协议,给image属性添加@Published修饰:
import SwiftUI import Combine class MJPEGStreamLib: NSObject, URLSessionDataDelegate, ObservableObject { // 其余原有代码保持不变 @Published var image = UIImage() // 仅修改这一行,添加@Published }
步骤2:调整View的观测对象
直接让MpegView观测MJPEGStreamLib实例,接收image变更通知:
struct MpegView: View { // 直接观测MJPEGStreamLib实例,接收image更新 @ObservedObject var mjpegStreamLib: MJPEGStreamLib var body: some View { Image(uiImage: mjpegStreamLib.image) .resizable() } } struct StreamView: View { @StateObject var stream = MJPEGStream() var body: some View { // 传入内部的MJPEGStreamLib实例 MpegView(mjpegStreamLib: stream.stream) .background(.red) .frame(width: 200, height: 200) } }
修改完成后新帧更新会自动触发View刷新,原有流处理逻辑无需改动。
内容的提问来源于stack exchange,提问作者gotnull
相关产品推荐
相关产品推荐

