首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有办法在Swift Combine中多次调用assign()?

在Swift Combine中,可以使用assign(to:on:)方法来将Publisher的输出值赋值给一个属性。但是,assign(to:on:)方法只能在第一次调用时生效,后续的调用将不会有任何效果。

如果需要在Swift Combine中多次调用assign(),可以使用sink(receiveValue:)方法来代替。sink(receiveValue:)方法可以接收Publisher的输出值,并执行自定义的操作,包括将值赋给属性。

下面是一个示例代码:

代码语言:txt
复制
import Combine

class MyClass {
    var myProperty: Int = 0 {
        didSet {
            print("myProperty updated: \(myProperty)")
        }
    }
}

let myObject = MyClass()

let publisher = PassthroughSubject<Int, Never>()

let cancellable = publisher.sink { value in
    myObject.myProperty = value
}

publisher.send(1)
publisher.send(2)
publisher.send(3)

// 输出:
// myProperty updated: 1
// myProperty updated: 2
// myProperty updated: 3

在上面的示例中,我们创建了一个自定义的类MyClass,其中包含一个属性myProperty。我们使用PassthroughSubject作为Publisher,并使用sink(receiveValue:)方法来接收Publisher的输出值,并将其赋给myObject.myProperty属性。

通过多次调用publisher.send()方法,我们可以多次更新myObject.myProperty属性,并在每次更新时打印出更新后的值。

需要注意的是,sink(receiveValue:)方法返回一个AnyCancellable对象,需要在不再需要接收Publisher的输出值时进行取消订阅,以避免内存泄漏。

这是一个简单的示例,展示了如何在Swift Combine中多次调用assign()的替代方法。根据具体的需求,你可以根据自己的情况进行调整和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

架构之路 (五) —— VIPER架构模式(一)

开始 首先看下主要内容: 本教程,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...演示者Presenter是架构的“交通警察”,视图view和交互器interactor之间指挥数据,执行用户操作并调用路由器视图之间移动用户。 实体Entity表示应用程序数据。...然后,TripDetailPresenter,将其内容设置为: import SwiftUI import Combine class TripDetailPresenter: ObservableObject...Routing 构建细节视图之前,您需要通过trip列表的router将其链接到应用程序的其余部分。 创建一个名为TripListRouter.swift的新Swift文件。...最后一个方法调用router来获取waypoint的一个waypoint视图,并将其放到一个NavigationLink

17.5K10

干货 | 深入浅出Apple响应式框架Combine

一、引言 Combine.framework 是Apple2019 WWDC 上基于Swift推出的函数响应框架(Functional Reactive Programming),支持Apple全平台的操作系统...使用sink方法和assign方法将在Combine内部自动创建subcribtion连接发布者和订阅者。...Combine的各种operators是定义Publisher的各种Extension各自的扩展实现了内置的classes或者structures。...虽然Combine本身是闭源的,但CombineFoundation层的代码确是开源的,有兴趣的读者可以参考Swift源码Publishers+URLSession.swift和Publishers...2)调用系统内置的assign方法将validToRegisterPublisher产生的value绑定到按钮的isEnabled属性上。 最终我们用Combine实现了MVVM模式的注册业务。

3.9K31
  • Swift中标识对象

    无论是缓存,还是磁盘上存储对象的表示,或者简单地使用字典——我们经常需要找到方法来唯一地识别我们所处理的对象。...本周,让我们来看看在Swift我们所掌握的一些常见的身份概念,以及我们如何以不同的方式将它们用于值和对象。 Equatable == 一个经常被用来比较对象和值的核心协议是Equatable。...对象标识符 ObjectIdentifier 解决上述问题的一个办法,是使用 Swift 的 ObjectIdentifier 类型来识别实例,并确保我们的渲染队列不会包含重复的实例。...然而,处理对象时,使用这篇文章的一些技术可以使你的API更容易使用,从而降低复杂性并提高稳定性。...处理Swift的对象身份时,你还有其他喜欢的技术吗? 译自 John Sundell 的 Identifying objects in Swift

    74620

    Swift 的类型占位符

    关于如何做到这一点的初步想法可能是简单地将我们的默认值传递给该主体的初始化器,然后将结果存储本地的一个let声明的属性(就像创建一个普通的Int值时一样)。...因为我们不希望我们的主体在这种情况下抛出任何错误,所以我们会给它一个Failure类型的值Never(这是 Swift 中使用 Combine 的一个常见惯例)。...现在让我们看看,如果我们创建主体时调用上述函数,而不是仅仅使用一个简单的整数,那么我们之前基于CurrentValueSubject的代码会是什么样子: // Before Swift 5.6: let...5.6 引入的一个新功能,处理稍微复杂的通用类型时,它可能真的很有用。...但值得指出的是,这些占位符只能在调用站点使用,而不是指定函数或计算属性的返回类型时使用。 - EOF -

    1.7K20

    Swift 的类型占位符

    关于如何做到这一点的初步想法可能是简单地将我们的默认值传递给该主体的初始化器,然后将结果存储本地的一个let声明的属性(就像创建一个普通的Int值时一样)。...因为我们不希望我们的主体在这种情况下抛出任何错误,所以我们会给它一个Failure类型的值Never(这是 Swift 中使用 Combine 的一个常见惯例)。...现在让我们看看,如果我们创建主体时调用上述函数,而不是仅仅使用一个简单的整数,那么我们之前基于CurrentValueSubject的代码会是什么样子: // Before Swift 5.6: let...5.6 引入的一个新功能,处理稍微复杂的通用类型时,它可能真的很有用。...但值得指出的是,这些占位符只能在调用站点使用,而不是指定函数或计算属性的返回类型时使用。 谢谢你的阅读!

    1.5K30

    iOS开源界面布局库终于破3000star

    经过几年的打磨和多次的重构,我的iOS开源界面布局库MyLayout的star数量终于2018年8月6号破3000了!有图为证: ? MyLayout 还有Swift版本TangramKit: ?...后来iOS6.0以后,苹果公司推出了一种新的界面布局方案AutoLayout,这种方法主旨是通过相对的约束设置进行布局来减少代码硬编码的编写,从而达到多设备适配以及简化布局的能力。...现在的版本要求子视图的位置或者是否隐藏改变后需要调用 使用线性布局时里面的子视图的frame.origin.y是无效的,而是通过子视图的headMargin,tailMargin分别指出其距离他...swift版本的TangramKit得到了有效的解决。...布局库不知名,所有没有很多的渠道和社区来进行讨论和交流。 布局种类众多不知道如何选择,因为系统提供了8种布局供选择,因此有可能会出现不知道选哪种最合适而导致迷惑。

    1.9K40

    iOS工程师必看的 20 道 面试题

    weak 一般用来修饰对象,assign一般用来修饰基本数据类型。原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,堆上容易造成崩溃。...Swift和Objective-C的混编项目中,如何在Swift文件调用Objective-C文件已经定义的方法?如何在Objective-C文件调用Swift文件定义的方法?...Swift若要使用Objective-C代码,可以ProjectName-Bridging-Header.h里添加Objective-C的头文件名称,Swift文件即可调用相应的Objective-C...Swift,协议扩展(protocol extension)可以定义部分方法的默认实现,这样这些方法实际调用中就是可选实现的了。...Objective-C,初始化方法无法保证所有成员变量都完成初始化;编译器对属性设置并无警告,但是实际操作中会出现初始化不完全的问题;初始化方法与普通方法并无实际差别,可以多次调用

    3.8K40

    了解 Swift 调度器

    本教程,我们将学习什么是调度器,以及我们如何在iOS应用开发中使用它们来管理队列和循环。之前对 SwiftCombine 框架和 iOS 开发的知识是必要的。 让我们开始吧! 什么是调度器?...切换调度器 使用 Combine 的 iOS 开发,许多消耗资源的任务都是在后台完成的,以防止应用程序的 UI 冻结或完全崩溃。然后,Combine 切换调度器,使任务的结果在主线程上执行。...Subscriptions.empty) _= subscriber.receive(3) subscriber.receive(completion: finished) } 如果我们从一个用户界面线程调用该任务... Combine ,这种类型的异步工作经常通过在后台调度器上订阅和在用户界面调度器上接收事件来执行。...我们还谈到了 Combine 框架以及它是如何影响 Swift 调度器的使用。 我们学习了如何在 Swift 中使用 receive(on) 和 subscribe(on) 方法来切换调度器。

    2.6K10

    Combine之Backpressure

    我们使用订阅者的时候,都是用Sink或者Assign,但是大家有没有想过一个问题,这两种订阅者第一次连接到发布者的时候,会发送一个无限大(unlimited)的需求(Demand)。...Combine 设计思路和 API 等等很多地方都参考了 ReactiveX,特别是具体到 RxSwift 的实现。...比如有一个非常常见的开发场景,我们可以输入框输入一些内容进行搜索操作,并且一旦输入框的内容改变了,我就去调用接口刷新对应的列表数据,但这个接口调用频率是一定要进行控制的,不然的话。...如果我按住一个英文字母键不放开,输入框会一直变化,就会不停的去调用接口来刷新页面数据,就算你的代码逻辑很好,不会卡顿不会崩溃,你们的后台人员也肯定会骂你,因为平白无故增加了服务器压力,这个时候,就可以用到这个背压的方式来进行控制和处理...实际使用我就不写了,比较简单,类似这样: 另外,我们也可以通过设置 flatMap 的 maxPublishers来控制发布频率,我举个例子: 然后,点击事件里面进行调用: 这样也同样实现了每隔一秒发布一次

    60120

    OC - 属性关键字和所有权修饰符

    这些关键字可以用于属性、方法返回值和参数,来指定对象的可空性,这样编写代码的时候就会智能提示。 Swift 可以使用!和?...这样就会造成一个问题: Swift 与 Objective-C 混编时,Swift 编译器并不知道一个 Objective-C 对象到底是optional还是non-optional,因此这种情况下编译器会隐式地将...__autoreleasing MRC 我们可以给对象发生 autorelease 消息来将它注册到 autoreleasepool ,而在 ARC 我们可以使用 __autoreleasing....相同点:修饰对象的时候,assign和weak都不改变对象的引用计数。...由于属性被声明为NSMutableArray类型,就不避免的会有调用方去调用它的添加对象、移除对象等一些方法,此时由于copy的结果是NSArray不可变对象,对NSArray对象调用添加对象、移除对象等方法

    1.4K31

    StateObject 与 ObservedObject

    StateObject 是 SwiftUI 2.0 才添加的属性包装器,它的出现解决了某些情况下使用 ObservedObject 视图会出现超预期的问题。...基于 Swift 的 ARC( 自动引用计数 )机制,StateObject 保证了可观察对象的生存期必定不小于视图的存续期,从而确保了视图的存续期内数据的稳定。...订阅 与 Cancellable Combine ,当使用 sink 或 assign 来订阅某个 Publisher 时,必须要持有该订阅关系,才能让这个订阅正常工作,订阅关系被包装成 AnyCancellable... SwiftUI 将视图添加到视图树上时,调用 _makeProperty 方法将需要持有的订阅关系、强引用等信息保存到 SwiftUI 内部的数据池中。...,都会随着视图描述实例的创建而一遍遍地被多次创建。

    2.4K20

    老人新兵 —— 一款 iOS APP 的开发手记

    以及 Core Data 的新特性对我很有吸引力兴趣驱动,没有商业压力和历史包袱,因此可直接采用尚未成熟或前景不明的技术经过一番了解后,最终选择 SwiftUI + Combine + Core...OC 一方面是学习成本要高于 Swift,另外在 5.0 后,Swift 也已经逐步稳定下来,出于多快好省的想法,使用 Swift 是当前 iOS 下进行开发的不错选择。...究其原因,大多 Swift 代码中使用了泛型、函数式编程等特性,这些知识基础书籍里都是一笔带过的,从而导致代码看得一头雾水。没关系,回炉重造。这里我要特别感谢 ObjCCN 翻译并撰写的书籍。...整个开发过程我通过 feedback 汇报了十余处明显的 bug,还有很多灵异现象由于无法使用简短的例程重现我都没有办法汇报。...我的 app 中有几处 Sheet 弹出的响应就比较慢( 将 view 移出 sheet,使用 NavigationLink 调用显示就很好 ),尤其是退出时的响应更慢。

    2.5K40

    Combine理论基础

    Rx 也有 Swift 版本 — RxSwift。 响应式异步编程 响应式异步编程,一个事件及其对应的数据被发布出来,最后被订阅者消化和使用。...Combine 的实现基于观察者模式。 Combine简介 现代 GUI 编程,开发者会处理大量事件(包括网络,屏幕输入,系统通知等),根据事件去让界面发生变化。...苹果为了帮助开发者简化异步编程,使代码更加简洁、易于维护,WWDC2019 发布了 Swift 的异步编程框架 — Combine。...核心概念 Combine 框架有三个核心概念 发布者(Publisher):负责发布事件 订阅者(Subscriber):负责订阅事件 操作符(Operator):负责Publisher和Subscriber...响应式编程与Combine的对应关系.png ? Combine概览.png Combine特点 基于泛型:支持泛型 类型安全:Swift 会检查类型安全问题。

    90810

    Swift-Runtime总结

    SwiftSwift类的函数的调用已经不是OC的运行时发送消息,和C类似,在编译阶段就确定了调用哪一个函数,所以纯Swift的类我们是没办法通过运行时去获取到它的属性和方法的。      ...Swift 对于继承自OC的类,为了兼容OC,凡是继承与OC的都是保留了它的特性的,所以可以使用Runtime获取到它的属性和方法等等其他我们OC获得的东西。      ...那这样就又衍生出一个问题   ----       那Swift就没办法利用Runtime了吗?       想一想,要是真的Swift办法利用Runtime,那是一件得多让人失望的事!...2、应用这点知识的时候,可以直接在ScrollView滚动的代理方法里面通过滚动距离的改变透明度生成你需要的Color,然后直接就在它的代理方法调用setNavigationBackgroundColor...可以看到自己定义的方法前面加了时间判断,最后还是调用了方法本身!这样就有了一个问题。你用自己的方法代替了系统的方法,加入了自己的一些东西,最有没有再去调用系统的方法?

    90830

    Swift Runtime ?

    你肯定也想过       OC相信每一个iOS开发都知道Runtime, 现在Swift也更新到4.0版本了,要是你也学习过Swift的话你可能也会想过这样一个问题,OC大家都知道是有动态性的,你能通过...SwiftSwift类的函数的调用已经不是OC的运行时发送消息,和C类似,在编译阶段就确定了调用哪一个函数,所以纯Swift的类我们是没办法通过运行时去获取到它的属性和方法的。      ...Swift 对于继承自OC的类,为了兼容OC,凡是继承与OC的都是保留了它的特性的,所以可以使用Runtime获取到它的属性和方法等等其他我们OC获得的东西。      ...那这样就又衍生出一个问题         那Swiftw就没办法利用Runtime了吗?       想一想,要是真的Swift办法利用Runtime,那是一件得多让人失望的事!...可以看到自己定义的方法前面加了时间判断,最后还是调用了方法本身!这样就有了一个问题。你用自己的方法代替了系统的方法,加入了自己的一些东西,最有没有再去调用系统的方法?

    4.9K71
    领券