我有以下设置,一个由GridView组成的GridViewCell

网格 View

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)
        }
    }
}

GridViewCell
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()中创建单元格时,每个单元格都获得了一个针对UITapGestureRecognizerhandleTap:,我也在使用:
typealias Position = (Int, Int)

因此,正如您所看到的,每当实例化GridView时,它就会传递一个回调函数tapHandler: Position -> (),当用户轻敲一个单元格时,该函数最终会被该单元格调用。

现在,我想将tap事件转换为RAC Signal。我不知道如何解决这个问题,因为我是RAC的新手。多亏了Colin Eberhardts blog articles,我得以对构建基块有了基本的了解并实现了一个自定义信号,如下所示:
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()完成此操作。这将为您提供一个元组,同时将signalobserver绑定(bind)到该信号:

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 () }

UIControl.rac_signalForControlEvents

我发布了带有扩展名的a gist ,以简化其中的一些常见操作。我希望这是有用的!

08-06 00:59