RxSwift发送及订阅 Subjects、Variables代码示例

Subjects 介绍

1. Subjects 是订阅者,也是Observable

订阅者:它能动态的接收新的值。

Observable: 当Subjects有了新值后会通过Event将新值发出给他的所有订阅者。

2. 常用的方法

  • onNext(:):是on(.next(:)) 的简便写法。该方法相当于 subject 接收到一个.next 事件。
  • onError(:):是on(.error(:))的简便写法。该方法相当于 subject 接收到一个.error 事件。
  • onCompleted():是 on(.completed)的简便写法。该方法相当于 subject 接收到一个 .completed事件。

3. Subjects 有四种PublishSubject、BehaviorSubject、ReplaySubject、Variable

相同点

  • 都是Observable,他们的订阅者都能接收他们发出的新的Event
  • 直到 Subject 发出 .complete 或者 .error 的 Event 后,该 Subject 便终结了,同时它也就不会再发出.next事件。
  • 对于那些在Subject 终结后再订阅他的订阅者,也能收到 subject发出的一条.complete 或.error的event,告诉这个新的订阅者它已经终结了。

不同点

  • PublishSubject
  • 最普通的Subject,不需要初始值就能初始化。
  • 他的订阅者只能收到他们订阅后的 Event。
let sub = PublishSubject<String>()

sub.onNext("订阅之前的不能接收到")

sub.subscribe { event in
  print(event.element)
//Optional("订阅之后的可以接收到")
//nil
}.disposed(by: disposeBag)

sub.onNext("订阅之后的可以接收到")
//结束
sub.onCompleted()
/// 结束之后添加的订阅能收到 completed
sub.subscribe { event in
  print(event)
}
sub.onNext("结束后发的都收不到")

BehaviorSubject

需要一个默认值初始化

当一个订阅者订阅之后会立马收到上一个Event,之后就是正常情况发一个收一个。

onCompleted()之后的订阅者也只能收到Completed。

let sub = BehaviorSubject(value: "默认值")

sub.subscribe { event in
  print("订阅1", event)
}.disposed(by: disposeBag)
sub.onNext("发送1")
sub.subscribe { event in
  print("订阅2", event)
}.disposed(by: disposeBag)
sub.onCompleted()
sub.subscribe { event in
  print("订阅3", event)
}.disposed(by: disposeBag)

订阅1 next(默认值)
订阅1 next(发送1)
订阅2 next(发送1)
订阅1 completed
订阅2 completed
订阅3 completed

ReplaySubject

创建的时候需要一个参数bufferSize设置记录个数

新添加的订阅会接收到之前发送的两个 Event,如果不足两个就只接收一个。

如果超过两个只接收最新的两个。

如果订阅时已经结束除了会接收到最新的两个Event外还有结束的complete或error。

let sub = ReplaySubject<String>.create(bufferSize: 2)

sub.subscribe { event in
  print("订阅1", event)
}.disposed(by: disposeBag)
sub.onNext("发送1")
print("-------")
sub.subscribe { event in
  print("订阅2", event)
}.disposed(by: disposeBag)

sub.onNext("发送2")
sub.onNext("发送3")
sub.onNext("发送4")
print("-------")
sub.subscribe { event in
  print("订阅3", event)
}.disposed(by: disposeBag)
sub.onCompleted()
print("-------")
/// 不仅会收到最后的两个 event 还有 Completed
sub.subscribe { event in
  print("订阅4", event)
}

订阅1 next(发送1)
-------
订阅2 next(发送1)
订阅1 next(发送2)
订阅2 next(发送2)
订阅1 next(发送3)
订阅2 next(发送3)
订阅1 next(发送4)
订阅2 next(发送4)
-------
订阅3 next(发送3)
订阅3 next(发送4)
订阅1 completed
订阅2 completed
订阅3 completed
-------
订阅4 next(发送3)
订阅4 next(发送4)
订阅4 completed

BehaviorRelay

基本同 BehaviorSubject功能一样,但是不能主动调用onCompleted和error,会在BehaviorRelay释放前调用

let sub = BehaviorRelay(value: "初始值")

sub.subscribe { event in
  print("第一次订阅", event)
}.disposed(by: disposeBag)
sub.accept("新值1")
sub.subscribe { event in
  print("第二次订阅", event)
}.disposed(by: disposeBag)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • RxSwift学习之Observable的新建、订阅及取消订阅

    前言 我们在前一篇基础之上,本文将会介绍 RxSwift 中的 Observables 部分. 在 RxSwift 中 Observable 也被称为 Observable Sequence.Sequence.Stream.Observable 会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播.下图是事件流的图像化表示: 其中从左到右的箭头代表时间轴,而三个圆圈则构成了可观察序列.而整个过程会按照从左到右的顺序.另外,事件可能在可观察序列生命周期内的任意时刻被触发. Obs

  • 浅谈RxSwift 网络请求

    一.说明 入坑RxSwift 有段时间了,之前在项目中只是小范围的使用RxSwift,为了更好的使用响应式编程,决定在项目中更广范围的使用RxSwift,然后研究了一下RxSwift的网络请求,现在有关网络请求的案例大多是基于RXSwift(4.0.0)或者更早的库来写的,本篇文章是基于目前最新的版本(4.2.0)版本来写的,由于RxSwift 版本的更新,里面的使用语法,发生了变化,在整理的过程中遇到了一些问题,为了让后来学习的小伙伴,节约时间,决定记录下来 二.网络请求 1.使用RxSwif

  • RxSwift使用技巧之过滤操作详解

    前言 在前面的基础之上接下来我会介绍一些常用的函数和实用技巧.首先,本文将会介绍那些用于对 next 事件进行过滤的操作.这些过滤操作类似于 Swift 标准库中的 filter 操作.它能在我们开始真正进行业务处理前先把那些不符合条件的过滤掉,而且这种函数式编程的范式也能开阔我们的思维. Ignore 过滤 RxSwift 中最简单直接的过滤操作就是 ignoreElements 了.该操作会屏蔽所有的 next 事件,只会将注意力放在 error 和 completed 事件上.如下图所示,

  • RxSwift学习教程之类型对象Subject详解

    前言 在上一篇文章我们介绍了 Observable 的基本概念和使用情形.但是大多数情形下,我们需要在应用运行时添加数据到 Observable 中并将其发送给订阅者.在这种需求场景下,我们就不得不使用 RxSwift 中另一种类型对象了 - Subject . 在应用中 Subject 实际上同时扮演了两个不同的角色:既是可观察对象同时也是观察者.这意味着 Subject 实例对象既可以接收事件也可以发送事件.例如,Subject 实例对象可以接收 next 事件信息,然后再将其发送给它自己的

  • RxSwift学习教程之基础篇

    前言 我们在 iOS 开发过程中,几乎无时无刻都要面对异步事件的处理.例如,按键点击.数据保存..音频后台播放.交互动画展示.这些事件并不具备特定时序性,甚至它们可能同时发生. 虽然 Apple 提供了通知.代理.GCD.闭包等异步机制,但是这些机制缺乏一个统一的抽象表述.另外,这些机制在处理共享的可变数据或状态时不够清晰简练.当然,这并不是说编写优雅的异步代码不现实.毕竟与其他平台相比 iOS 的异步机制还是很强大的. 幸运的是,我们能够通过 RxSwift 优雅的处理异步代码. 至于 RxS

  • RxSwift实现替换delegate的方法示例

    目标 最近写项目 ,写到需要为自己写的一个控件添加rx订阅方式的案例. 目前有一个代理: // 代理方式获取结果 @objc public protocol ZZPhotoPickerControllerDelegate : NSObjectProtocol { @objc optional func photoPickerController(_ photoPickerController: ZZPhotoPickerController, didSelect assets: [Any]) }

  • RxSwift发送及订阅 Subjects、Variables代码示例

    Subjects 介绍 1. Subjects 是订阅者,也是Observable 订阅者:它能动态的接收新的值. Observable: 当Subjects有了新值后会通过Event将新值发出给他的所有订阅者. 2. 常用的方法 onNext(:):是on(.next(:)) 的简便写法.该方法相当于 subject 接收到一个.next 事件. onError(:):是on(.error(:))的简便写法.该方法相当于 subject 接收到一个.error 事件. onCompleted(

  • Java使用JavaMail API发送和接收邮件的代码示例

    使用Javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/javamail/index-138643.html): mailapi.jar.定义了收发邮件所使用到的接口API: smtp.jar.包含了发送邮件使用到的类: pop3.jar.包含了收邮件使用到的类: 我们通常发送邮件使用的协议是smtp协议,接受邮件使用的协议是pop3协议.或者,我们直接将mail.jar加入到工程,这

  • Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用onTouchListener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private MediaPlayer mPlayer = null; private MediaRecorder mRecorder = null; //语音文件保存路径 private String FileName = null; FileName = Environment.getExternalStorageDirectory().getAbs

  • C#微信公众号与订阅号接口开发示例代码

    本文实例讲述了C#微信公众号与订阅号接口开发示例代码.分享给大家供大家参考,具体如下: using System; using System.Web; using System.IO; using System.Text; using System.Web.Security; using weixin_api; public class wxgz_api : IHttpHandler { public void ProcessRequest(HttpContext context) { cont

  • Python3调用微信企业号API发送文本消息代码示例

    本文主要向大家分享了Python3调用微信企业号API发送文本消息示例的有关代码,具体如下: #!/usr/bin/env python # -*- coding:utf-8 -*- import urllib.request import json import sys import logging touser = '@all' agentid = 0 corpid = 'wx5aef2da956514535' corpsecret = 'Co17m_OPlvE8Q4P2RKKwtq5oIA

  • Django使用celery异步发送短信验证码代码示例

    目录 celery 1.celery介绍 1.1 celery应用举例 1.2 Celery有以下优点 1.3 Celery 特性 2.工作原理 2.1 Celery 扮演生产者和消费者的角色 3.异步发短信 1.settings同级目录下创建 celery 文件 2.配置settings文件 3 配置 settings同级目录下 init 文件 4.在utils下新建一个task.py文件 5.接口中调用 6 .先启动django项目 然后另开终端 cd到项目 celery 1.celery介

  • vue实现通过手机号发送短信验证码登录的示例代码

    本文主要介绍了vue实现通过手机号发送短信验证码登录的示例代码,分享给大家,具体如下: <template> <div class="get-mobile" @touchmove.prevent> <div class="main"> <div class="pt-20 pr-15 pl-15 pb-20"> <input class="input mb-15" v-mod

  • Java设计模式之访问者模式使用场景及代码示例

    Java设计模式访问者模式 模式概念 访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.访问者模式适用于数据结构相对稳定算法又易变化的系统,若系统数据结构对象易于变化,则不适合使用访问者模式.访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者. Visitor应用场景 一定会有的疑问:visitor和iterator的区别: visitor可以访问不同的对象(只需要在Element定义对应的accept),但是Ite

  • 浅谈Java多线程的优点及代码示例

    尽管面临很多挑战,多线程有一些优点使得它一直被使用.这些优点是: 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 资源利用率更好 想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景.比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒.处理两个文件则需要: 5秒读取文件A 2秒处理文件A 5秒读取文件B 2秒处理文件B --------------------- 总共需要14秒 从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据.在这段时间里,CPU非常的

  • Java中Volatile关键字详解及代码示例

    一.基本概念 先补充一下概念:Java内存模型中的可见性.原子性和有序性. 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.也就是一个线程修改的结果.另一个线程马上就能看到.比如:用volatile修饰的变量,就会具有可见性.volatile修饰的

随机推荐