gpt4 book ai didi

ios - 使用 ReactiveCocoa 4 的简单 UIGestureRecogniser 示例

转载 作者:可可西里 更新时间:2023-11-01 01:01:31 25 4
gpt4 key购买 nike

努力让一个简单的 ReactiveCocoa 4 示例正常工作。

  • 我的层次结构中有一个 View 的平移手势识别器。
  • 我有一个预期的触摸事件目标类(假设我想根据触摸位置生成网络数据包)。

所以看起来我想从我的手势识别器创建一个信号,映射以提取相对于某个 View 的触摸位置,然后让我的目标类观察这个信号(或者只是有一些调用方法的最终 subscribeNext block 在我的目的地类(class))。

但是,似乎无法使任何工作正常进行,也找不到可效仿的好例子。

我想我应该写这样的东西(伪代码)

panRecognizer
.rac_gestureSignal()
.map { (pgr:UIPanGestureRecognizer) -> CGPoint in
return pgr.locationInView(self.someUiView)
}.subscribeNext { (location: CGPoint) -> Void in
self.someNetworkDelegate.updatePosition(location)
}

这样的事情可能吗(看起来很简单)?我是否尝试以错误的方式使用该框架?

最佳答案

你实际上真的很接近那里。

但是您不能拥有 CGPointRACSignal,因为 CGPoint 不是引用类型。通常,在 ReactiveCocoa 2 世界中,您可以通过显式装箱和拆箱类型(如 NSValue)并进行一些转换来解决这个问题:

panRecognizer.rac_gestureSignal()
.map({ [unowned self] (pgr: AnyObject!) -> NSValue! in
let pgr = pgr as! UIPanGestureRecognizer
return NSValue(CGPoint: pgr.locationInView(self.someUiView))
}).subscribeNext({[unowned self] locationValue in
let location = locationValue.CGPointValue
self.someNetworkDelegate.updatePosition(location)
})

但是,通过将 RACSignal 转换为 SignalProducer,您可以使用所需的良好类型。这样做……很麻烦,所以我使用了以下助手:

extension SignalProducer {
func castSignal<T>() -> SignalProducer<T, Error> {
return self.map({ $0 as! T })
}

func cantError() -> SignalProducer<Value, NoError> {
// If we inline this, Swift will try to implicitly return the fatalError
// expression. If we put an explicit return to stop this, it complains
// it can never execute. One is an error, the other a warning, so we're
// taking the coward's way out and doing this to sidestep the problem.
func swallowError(error: Error) -> SignalProducer<Value, NoError> {
fatalError("Underlying signal errored! \(error)")
}

return self.flatMapError(swallowError)
}
}

extension RACSignal {
func cast<T>() -> SignalProducer<T, NoError> {
return self.toSignalProducer().cantError().map({ $0! }).castSignal()
}
}

显然,如果您要转换可能出错的信号,则需要不同的帮助程序,但这对于本示例来说效果很好。

有了这些,您可以像这样编写代码:

    self.reportTapRecognizer.rac_gestureSignal().cast()
.map({ [unowned self] (pgr: UIPanGestureRecognizer) -> CGPoint in
return pgr.locationInView(self.someUiView)
}).startWithNext({ [unowned self] location in
self.someNetworkDelegate.updatePosition(location)
})

这就是基本上你在上面写的方式。请注意,map 调用中需要类型注释,以便 cast 可以正确推断其返回类型。

关于ios - 使用 ReactiveCocoa 4 的简单 UIGestureRecogniser 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34684765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com