如何在 ReactiveCocoa 4 中创建自定义信号?

2024-02-11

我有以下设置,GridView包括GridViewCells.

GridView

class GridView : UIView {

    var gridViewCells: [GridViewCell] = []
    let tapHandler: Position -> ()

    init(frame: CGRect, tapHandler: Position -> ()) {
        self.tapHandler = tapHandler
        super.init(frame: frame)
        self.gridViewCells = createCells(self)
        addCellsToView(self.gridViewCells)
    }

    func addCellsToView(cells: [GridViewCell]) {
        for cell in cells {
            self.addSubview(cell)
        }
    }
}

网格视图单元格

class GridViewCell: UIImageView {

    let position: Position
    let tapHandler: Position -> ()

    init(frame: CGRect, position: Position, tapHandler: Position -> ()) {
        self.position = position
        self.tapHandler = tapHandler
        super.init(frame: frame)
    }

    func handleTap(sender: UITapGestureRecognizer) {
        self.tapHandler(self.position)
    }    
}

请注意,我省略了代码中一些不太相关的部分,只需知道在创建单元格时createCells(),每个细胞得到一个UITapGestureRecognizer其目标是handleTap:,我也在使用:

typealias Position = (Int, Int)

所以,正如你所看到的,每当GridView被实例化,它被传递一个回调函数tapHandler: Position -> ()当用户点击单元格时,最终会被单元格调用。

现在,我想将 Tap 事件变成 RACSignal。我不知道如何解决这个问题,因为我对 RAC 很陌生。谢谢Colin Eberhardts 博客文章 http://blog.scottlogic.com/2015/04/24/first-look-reactive-cocoa-3.html,我设法对构建块有了基本的了解,并实现了一个自定义信号,如下所示:

func createSignal() -> Signal<String, NoError> {
    var count = 0
    return Signal {
        sink in
        NSTimer.schedule(repeatInterval: 1.0) { timer in
            sink.sendNext("tick #\(count++)")
        }
        return nil
    }
}

我现在基本上想要类似的行为,只是发出的事件不是由NSTimer,而是通过handleTap()功能。


您可以通过使用来完成此操作Signal.pipe()。这给你一个元组signal,以及observer与该信号相关:

let (signal, observer) = Signal<String, NoError>.pipe()

您可以像以前一样使用它sink在你的例子中(请注意sink只是旧术语observer :))

不过,对于按钮或手势识别器,您可以利用RAC 2扩展。例如:

let signal: SignalProducer<(), NoError> = gestureRecognizer
   .rac_gestureSignal()
   .toSignalProducer()
   .mapError { fatalError("Unexpected error: \(error)"); return () } // errors cannot occur, but because they weren't typed in `RACSignal` we have to explicitly ignore them.
   .map { _ in () }

Or UIControl.rac_signalForControlEvents.

我发表了a gist https://gist.github.com/NachoSoto/25b0003c1b15d7d11a8d通过扩展来简化其中一些常见操作。我希望这有用!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ReactiveCocoa 4 中创建自定义信号? 的相关文章

  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • UITextFieldDelegate 与 UITextField 控件事件

    如果我想处理 UITextField 的更改 例如用户在其中键入 看起来这可以通过将委托分配给该文本字段 然后让委托实现 shouldChangeCharactersInRange 来完成 或者通过将目标添加到文本字段并处理 UIContr
  • 如何使用正则表达式将字符串分成相同字符的组?

    我有一个这样的字符串 var string AAAAAAABBBCCCCCCDD 并喜欢将字符串分割成这种格式的数组 same characters gt same group 使用正则表达式 Array AAAAAAA BBB CCCCC
  • 在另一种语言中使用 dateFormatter [重复]

    这个问题在这里已经有答案了 我正在运行一段返回的代码nil在具有不同语言设置的 iPhone 上运行时 代码示例如下所示 let dateFormatter DateFormatter dateFormatter dateFormat MM
  • PresentModalViewController 不执行任何操作

    我有一个 UIViewController parent 调用presentModalViewController与另一个 UIViewController child on viewDidLoad If parent没有 UINaviga
  • 在后台任务中安排通知

    我正在为 iOS 开发一个日历 闹钟应用程序 它与网络服务器同步 当在服务器上添加活动时 会发出推送通知 以便 iOS 客户端可以获取新数据 并根据需要更新和安排下一次警报的时间 本地通知 但这仅在应用程序在客户端打开时才有效 我希望客户端
  • UISearchController 保留问题

    我正在尝试使用 UISearchController 但是我遇到了无法解决的保留问题 MainTableview 有两个部分 第1节 基于某些正则表达式过滤数据 第2节 All Data 我将 UISearchController 添加到我
  • 使用 Google place API 从 lat long 获取附近的地点

    我正在使用 google place API 即 https maps googleapis com maps api place search json location 33 7167 73 0667 radius 500 type f
  • 在 Swift 中自动移动 UISlider

    我想在按下按钮时将 UISlider 从 minValue 循环移动到 maxValue 并在再次按下按钮时将其停止在当前位置 我想使用 Swift 我遇到的主要问题是函数 slider setValue 太快了 我希望动画更慢 IBAct
  • 如何使用 Swift 获取 YouTube 频道的所有播放列表?

    我的问题不是关于从一般频道检索视频 我只想获取该频道创建的所有 播放列表 并检索每个播放列表的缩略图 标题和视频数量 这是一个 YouTube 频道示例 正如您所看到的 有很多已创建的播放列表 截至目前 我只能获取某个频道最新上传的视频 在
  • 线程 1:信号 SIGABRT - AppDelegate.h

    main m Journey Created by Julian Buscema on 2014 07 13 Copyright c 2014 Julian Buscema All rights reserved import
  • Swift 中具有透明背景的按钮边框

    我怎样才能做一个UIButton边框看起来像下图 入门 按钮一样具有透明背景吗 我应该如何使用情节提要来实现这一点 或者如何以编程方式实现这一点 设置backgroundColor to clearColor使按钮透明 例如尝试下面的代码
  • 使用 UIImageJPEGRepresentation 时,compressionQuality 应该是多少?

    我想对用户库中的照片应用滤镜 然后将其写回磁盘 我在用着UIImageJPEGRepresentation 该函数需要一个UIImage and a compressionQuality值介于 0 0 和 1 0 之间 因为我想保留原始质量
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • 在 Instruments 中查找内存泄漏行

    我是 iOS 中的仪器新手 我正在尝试使用 Xcode 4 5 2 并按照本教程查找仪器中的内存泄漏 http soulwithmobiletechnology blogspot sg 2011 04 how to check memory
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector

随机推荐

  • 在 Electron process.stderr 中未定义

    我正在尝试在我的 Electron 应用程序中使用 sqlite3 nodejs 插件 我在加载 sqlite3 模块时遇到错误 查看崩溃的堆栈跟踪 我发现 sqlite3 有多个依赖项 其中之一是日志库 npmlog 该库尝试从以下位置初
  • Google Glass:执行“点击”事件或类似的事件

    请看下面的代码
  • 在 ES6 中如何调用我的类的父类的父类的构造函数?

    我正在使用 ES6 类 我的类 A 扩展了类 B 类 B 扩展了类 C A 如何扩展一个方法 然后调用该方法的 C 版本 class C constructor console log class c class B extends C c
  • 如何在 SQL Server Express 表中保存 QTime 并读取它?

    我在 SQL Server Express 中有一个包含字段的表name varchar 10 and timeVar time我想保存 a 的值QTime变量在time field 这是我尝试过的 QTime time QTime cur
  • 无法按名称激活工作表

    我试图在打开电子表格时根据当前月份激活每月工作表 问题出在脚本末尾 无法选择工作表 看起来getSheetByName gets a null值 不被接受setActiveSheet function selectmonth var now
  • 搜索大量大文本的最快方法

    我有一个用 C 编写的 Windows 应用程序 需要从数据库加载 250 000 行 并提供 键入时搜索 功能 这意味着只要用户在文本框中键入内容 应用程序就需要搜索所有 250 000 条记录 其中顺便说一句 单列 每行 1000 个字
  • 使用 Box2D 制作角色动画的最佳方法是什么?

    我正在为 Android 开发一款 2D 水下动作角色扮演游戏 使用 Box2D 作为物理引擎 主要用于碰撞检测 碰撞响应以及游戏角色在由墙壁 岩石和其他生物组成的环境中的移动 我尝试了两种不同的方法来使用 Box2D 实现角色动画 但都发
  • 无法将类型“System.Reflection.PropertyInfo”转换为

    我正在尝试使用反射来迭代我的类之一中的所有属性 public MDInstrument base PropertyInfo properties typeof MDInstrument GetProperties foreach Prope
  • Oauth2 PKCE 谁应该生成代码验证器和代码质询

    我正在编写将与某些 Oauth2 提供商集成的客户端应用程序 我将把原生 android 应用程序作为前端 将 spring boot 作为后端 我想将授权代码流与 PKCE 一起使用 我的问题是谁应该生成代码验证程序和代码挑战 我的后端还
  • 提取字符串的前(或后)n 个字符

    我想提取第一个 或最后一个 n字符串的字符 这相当于 Excel 的LEFT and RIGHT 一个小例子 create a string a lt paste left right sep a 1 leftright 我想生产b 一个等
  • Selenium 隐式等待与 Thread.sleep()

    根据 selenium 的说法 隐式等待会在一定时间内轮询 DOM 以查看元素是否出现 我的理解是 它将轮询指定的时间 但如果之前出现过某个元素 那么它将继续 而无需进一步等待 http seleniumhq org docs 04 web
  • PartialFunction orElse 的类型界限是否比应有的更宽松?

    让我们定义一个PartialFunction String String and a PartialFunction Any String 现在 给出定义orElse def orElse A1 lt A B1 gt B that Part
  • Scala下划线解释

    看看这些 scala 片段 如果我们有这样的东西 List List 1 2 List 3 4 List 5 map x gt x size 我们可以将其缩短为 List List 1 2 List 3 4 List 5 map size
  • 哪种排序算法可提供最佳的最坏情况性能?

    对于绝对最坏的情况 最快的已知排序算法是什么 我不关心最好的情况 并且假设有一个巨大的数据集 如果这很重要的话 确保你已经看到这个 可视化排序算法 http www sorting algorithms com 它帮助我决定使用哪种算法
  • Php PDO 函数:lastInsertId 的安全性如何?

    我对 Php PDO 函数 lastInsertID 没有什么困惑 如果我理解正确的话 它会返回插入数据库的最后一个自动增量ID 当我创建注册用户的功能时 当我执行在数据库中插入用户的查询时 我通常会使用此函数 我的问题是 例如 我有一百个
  • 设置JAVA_HOME和JRE_HOME路径

    我被分配了一个 Linux 机器 里面有 java 可用 java version java version 1 7 0 09 icedtea OpenJDK Runtime Environment rhel 2 3 4 1 el6 3 x
  • twitter4j - 如何配置?

    我正在尝试使用编写一个简单的 Twitter 客户端推特4j http twitter4j org 但我似乎无法完成第一步 配置参数 有一个配置页 http twitter4j org en configuration html在网站上说我
  • 我应该在 EDT 中分配/创建 swing 元素吗?

    我应该在 EDT 中创建 swing 元素吗 我在编辑非线程安全图形元素时遇到了并发问题 但我正在创建它们 但它们尚未显示 如果它们很多或需要一些时间来分配 这会冻结 GUI 但不会是吗 下面是我使用 EDT 来显示但不创建 GUI 结构的
  • React-Native:更改 ImageBackground 的不透明度颜色

    我一直在尝试开发下面提到的屏幕 为此 我创建了以下组件 import React Component from react import View Text StyleSheet ImageBackground Image from rea
  • 如何在 ReactiveCocoa 4 中创建自定义信号?

    我有以下设置 GridView包括GridViewCells GridView class GridView UIView var gridViewCells GridViewCell let tapHandler Position gt