Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何收听ObservableObject

如何收听ObservableObject
EN

Stack Overflow用户
提问于 2020-01-21 19:16:41
回答 2查看 12.2K关注 0票数 18

好的,那么SwiftUIObservableObject,在iOS 13上,我有实现ObservableObjectModel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Model: ObservableObject {
    @Published public var toggle: Bool = false

    init() {
        NSLog("Model init")
        objectWillChange.sink { void in
            NSLog("1 toggle \(self.toggle)")
        }
        $toggle.sink { v in
            NSLog("2 toggle \(self.toggle) -> \(v)")
        }
    }
}

还有一个按钮,可以切换toggle

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ContentView: View {
    @ObservedObject var model: Model
    
    var body: some View {
        Button(action: {
            self.model.toggle.toggle()
        }, label: {Text(model.toggle ? "on" : "off")})
    }
}

现在,这是可行的。你按下按钮,它会在“打开”和“关闭”之间切换。(在制作toggle @Published之前,它没有这么做。)但是,日志记录不像预期的那样工作。我在启动时立即获得两个日志:"Model“和"2切换假-> false”。点击按钮,虽然显然改变了toggle的值,但并不会导致任何一个闭包的执行。

当视图改变您的模型时,我希望有一种方法来了解更改的情况,以防您需要更新计算值或同步到磁盘或其他东西。也许sink是错误的方法?

在更新字段时,如何通知具有ObservableObject字段的@Published字段?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-21 22:33:35

sink函数返回值的最新文档:

/// - Returns: A cancellable instance; used when you end assignment of the received value. Deallocation of the result will tear down the subscription stream.

从本质上说,这意味着接收器可以生成Subscriber,但不会保留它。一旦您的init完成,订阅服务器就会被删除并从内存中删除。您需要通过创建这样一个强大的引用来保持它们:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Model: ObservableObject {
    @Published public var toggle: Bool = false

    var changeSink: AnyCancellable?
    var toggleSink: AnyCancellable?

    init() {
        NSLog("Model init")
        changeSink = objectWillChange.sink { void in
            NSLog("1 toggle \(self.toggle)")
        }
        toggleSink = $toggle.sink { v in
            NSLog("2 toggle \(self.toggle) -> \(v)")
        }
    }
}

我使用的Combine不多,但您可能经常考虑的另一种方法是向属性添加一个didSet,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public var toggle: Bool = false {
        didSet {
            print("1 toggle \(self.toggle)")
        }
    }
票数 23
EN

Stack Overflow用户

发布于 2020-01-21 22:59:44

您的ObservableObject类Model是正确的,但是:

1. ObjectWillChange应该是ObservableObjectPublisher()类型。

,它将objectWillChange属性创建为ObservableObjetPublisher的实例。这来自组合框架,这就是为什么您需要添加导入组合以使代码编译。一个可观察的对象发布者的工作很简单:每当我们想告诉世界我们的对象已经改变了,我们就要求发行者为我们做这件事。

2.您需要观察的属性(Toggle)应该以如下方式实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var toggle = "" {
        willSet {
            objectWillChange.send()
        }
    }

第二,我们在模型的Toggle属性上附加了一个willSet属性观察者,这样我们就可以在值发生变化时运行代码。在我们的示例代码中,每当切换更改时,我们都调用objectWillChange.send(),这就是告诉objectWillChange发布者发布我们的数据已经更改的消息,以便任何订阅的视图都可以刷新。

确保类模型符合@ObservedObject,并且它的实例被标记为 ObservableObject

,因为您的模型类符合ObservableObject,所以您可以像使用任何其他@ObservedObject属性一样使用它。所以,我们可以用它来观看切换,就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ContentView: View {
    @ObservedObject var model: Model

    var body: some View {
        Button(action: {
            self.model.toggle.toggle()
        }, label: {Text($model.toggle ? "on" : "off")})
    }
}

希望这有帮助,参考:https://www.hackingwithswift.com/quick-start/swiftui/how-to-send-state-updates-manually-using-objectwillchange

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59852106

复制
相关文章
Swift 中的属性包装器
当处理代表某种状态形式的属性时,通常会在每次修改值时触发某种关联的逻辑。例如,我们可以根据一组规则验证每个新值,可以以某种方式转换分配的值,或者每当值更改时都可以通知一组观察者。
韦弦zhy
2021/04/08
2.7K0
Owl项目
不久的将来是物联网。也就是说,不仅在地理上最大程度地覆盖了全球网络,而且还渗透到了生活的各个领域。包括我们的房屋在内,几乎所有家用电器中都有。这就需要进一步开发带有设备的收发器网络。
云深无际
2020/08/12
1.5K0
Owl项目
bootstrap carousel 轮播
<!doctype html> <html> <head> <meta charset="utf-8"> <title>联想控股</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="css/bootstrap.css" rel="stylesheet" type="text/css"> <script src="http://code.jquery.com/jquery.js"></script> <script src="js/bootstrap.js"></script> </head> <body> <div id="myCarousel" class="carousel slide"> <ol class="carousel-indicators"> <li data-target="#myCarousel" data-slide-to="0" class="active"></li> <li data-target="#myCarousel" data-slide-to="1"></li> <li data-target="#myCarousel" data-slide-to="2"></li> </ol> <div class="carousel-inner"> <div class="item active"> <img src="/wp-content/uploads/2014/07/slide1.png" alt="First slide"> <div class="carousel-caption">标题 1</div> </div> <div class="item"> <img src="/wp-content/uploads/2014/07/slide2.png" alt="Second slide"> <div class="carousel-caption">标题 2</div> </div> <div class="item"> <img src="/wp-content/uploads/2014/07/slide3.png" alt="Third slide"> <div class="carousel-caption">标题 3</div> </div> </div> <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev"> <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> <span class="sr-only">Previous</span> </a> <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next"> <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> <span class="sr-only">Next</span> </a> </div> </body> </html>
用户5760343
2019/07/07
9100
【OWL】:Web Ontology Language
The W3C OWL 2 Web Ontology Language (OWL) is a Semantic Web language designed to represent rich and complex knowledge about things, groups of things, and relations between things. OWL is a computational logic-based language such that knowledge expressed in OWL can be reasoned with by computer programs either to verify the consistency of that knowledge or to make implicit knowledge explicit. OWL documents, known as ontologies, can be published in the World Wide Web and may refer to or be referred from other OWL ontologies. OWL is part of the W3C's Semantic Web technology stack, which includes RDF [RDF Concepts] and SPARQL [SPARQL].
WEBJ2EE
2021/09/24
1.7K1
【OWL】:Web Ontology Language
Java-包装器类
所有的基本类型都有一个与之对应的类,这些类称为包装器类。对象包装器类是不可改变的,即一旦构造类包装器类,就不允许更改包装在其中的值。同时,对象包装器类还是final,因此不能定义它们的子类。
用户7886150
2021/02/02
5920
java中的包装类
  通过查看源码或API文档,我们可以知道包装类再java.lang包下,而且所有包装类都是final修饰的,即不能被继承。里面维护的基本数据类型的变量value,也是final修饰的,不能更改,即一旦创建对象,其内容就不能修改。包装类主要分为三种不同类型:数值类型(Byte、Short、Integer、Long、Float和Double)、Character类型、Boolean类型。
别团等shy哥发育
2023/02/25
1K0
java中的包装类
【C++11】 包装器 | bind
function包装器 也被叫做 适配器 C++11中function本质是类模板,也是一个包装器
lovevivi
2023/10/17
2550
【C++11】 包装器 | bind
20款移动开发中很有用的 jQuery 插件
在开发任何移动项目时,要尽可能保持每一种资源尺寸都尽可能的小,以给最终用户提供一个好的体验是非常重要的。在这篇文章中我们已经编制了今年新出炉的 jQuery 移动插件列表,收集了滑块,旋转木马,画廊,
用户1667431
2018/04/18
2.3K0
20款移动开发中很有用的 jQuery 插件
bootstrap源码分析之Carousel
源码文件: Carousel.scss Carousel.js 实现原理: 隐藏所有要显示的元素,然后指定当前要显示的为block,宽、高自适应 源码分析: 1、Html结构:主要分为以四个部分   1.1、容器:最外层div,需要一个data-ride=”carousel”来指定为轮播放插件,并且提供一个Id,方便圆圈指示符的关联   1.2、图片列表部分,用一个外层div包裹所有,然后每个img会被一个div,则class为item的包裹住   1.3、圆圈指示符:用一个ol列表来显示其各图形列表项,
sam dragon
2018/01/17
2K0
bootstrap源码分析之Carousel
优化算法——OWL-QN
一、正则化(Regularization) 1、正则化的作用     在机器学习中,正则化是相对于过拟合出现的一种特征选择的方法。在机器学习算法中使用的Loss项为最小化误差,而最小化误差是为了让我们
felixzhao
2018/03/19
1.6K0
优化算法——OWL-QN
C++11 包装器function
C++提供了多个包装器,它们主要是为了给其他编程接口提供更一致或更合适的接口。C++11提供了多个包装器,这里我们重点了解一下包装器function。
艰默
2023/02/26
6780
C++11 包装器function
优化算法——OWL-QN
    在机器学习中,正则化是相对于过拟合出现的一种特征选择的方法。在机器学习算法中使用的Loss项为最小化误差,而最小化误差是为了让我们的模型拟合我们的训练数据,此时,若参数过分拟合我们的训练数据就会形成过拟合的问题,而规则化参数的目的就是为看防止我们的模型过分拟合我们的训练数据。此时,我们会在Loss项之后加上正则项以约束模型中的参数:
felixzhao
2019/02/13
1.1K0
排名Top6的轮播组件,让你眼前一亮的选择!
上周公司的一个项目中有用到了轮播的功能。于是收集和总结了一些常用的轮播/走马灯组件库。这里分享给大家。
程序员老鱼
2023/08/10
1.8K0
排名Top6的轮播组件,让你眼前一亮的选择!
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。
AiDBA宝典
2019/09/30
28.8K0
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
获取包装异常中真实异常
没有弄清对方的底细,绝不能掏出你的心来——巴尔扎克 重复调用getCause即可 package io.github.vampireachao.stream.core.lambda; /** * LambdaInvokeException * * @author VampireAchao ZVerify * @since 2022/9/4 */ public class LambdaInvokeException extends RuntimeException { /**
阿超
2022/10/31
6440
New UWP Community Toolkit - Carousel
概述 New UWP Community Toolkit  V2.2.0 的版本发布日志中提到了 Carousel 的调整,本篇我们结合代码详细讲解  Carousel 的实现。 Carousel 是一种传送带形态的控件,在图片展示类的应用中有非常多的应用,它拥有很好的流畅度,可以做很多的自定义,并集成了鼠标,触摸板,键盘等的操作。我们来看一下官方的介绍和官网示例中的展示: The Carousel control provides a new control, inherited from the It
Shao Meng
2018/04/28
1.4K0
New UWP Community Toolkit - Carousel
解构 Solidity 合约 #3:函数包装器
号外,今天我们的登链社区网站做了一点小更新, 作者们可以关联自己的社交账号,关联后,在文章右侧的作者区域就可以看到点亮的小图标,让更多的小伙伴通过内容交朋友,也欢迎大家关注登链社区的账号。
Tiny熊
2023/01/09
6600
解构 Solidity 合约 #3:函数包装器
点击加载更多

相似问题

更改owl-carousel包装类?

18

如何在React owl Carousel中使用Owl carousel选项?

28

如何在Owl carousel中显示多个项目?

291

Owl Carousel返回错误

32

OWL Carousel无函数

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文