DelegateProxy 1.1.0

DelegateProxy 1.1.0

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布最后发布2016年11月
SwiftSwift 版本3.0
SPM支持 SPM

ra1028 维护。



  • ra1028

DelegateProxy


Codebeat

更实际地接收代理事件


关于 DelegateProxy

DelegateProxy 通过订阅处理程序接收代理事件。

这是委托代理的通用版本,由 RxSwift 提供。

这意味着可以与任何其他响应式框架结合使用,如 ReactiveCocoaSwiftBond 等。


要求

  • Swift 3 / Xcode 8
  • OS X 10.9 或更高版本
  • iOS 8.0 或更高版本
  • watchOS 2.0 或更高版本
  • tvOS 9.0 或更高版本


基本示例

创建继承自 DelegateProxy 的类。

final class ScrollViewDelegateProxy: DelegateProxy, UIScrollViewDelegate, DelegateProxyType {
    func resetDelegateProxy(owner: UIScrollView) {
        owner.delegate = self
    }
}

实现扩展可能会有用。

extension UIScrollView {
    var delegateProxy: ScrollViewDelegateProxy {
        return .proxy(for: self)
    }
}

您可以按以下方式接收代理事件。

scrollView.delegateProxy
    .receive(#selector(UIScrollViewDelegate.scrollViewDidScroll(_:))) { args in
        guard let scrollView: UIScrollView = args.value(at: 0) else { return }
        print(scrollView.contentOffset)
}

自定义示例

您可以通过实现 Receivable 协议的类来接收代理事件。
以下是使用响应式框架的委托代理使用示例。

ReactiveCocoa

创建接收器类。

final class RACReceiver: Receivable {
    let (signal, observer) = Signal<Arguments, NoError>.pipe()

    func send(arguments: Arguments) {
        observer.send(value: arguments)
    }
}

扩展

extension DelegateProxy {
    func rac_receive(selector: Selector) -> Signal<Arguments, NoError> {
        return RACReceiver().subscribe(to: self, selector: selector).signal
    }
}

通过流接收事件。

scrollView.delegateProxy
    .rac_receive(selector: #selector(UIScrollViewDelegate.scrollViewDidScroll(_:)))
    .map { $0.value(at: 0, as: UIScrollView.self)?.contentOffset }
    .skipNil()
    .observeValues { print("ContentOffset: \($0)") }

SwiftBond

创建接收器类。

final class BondReceiver: Receivable {
    let subject = PublishSubject<Arguments, NoError>()

    func send(arguments: Arguments) {
        subject.next(arguments)
    }
}

扩展

extension DelegateProxy {
    func bnd_receive(selector: Selector) -> Signal<Arguments, NoError> {
        return BondReceiver().subscribe(to: self, selector: selector).subject.toSignal()
    }
}

通过流接收事件。

scrollView.delegateProxy
    .bnd_receive(selector: #selector(UIScrollViewDelegate.scrollViewDidScroll(_:)))
    .map { $0.value(at: 0, as: UIScrollView.self)?.contentOffset }
    .ignoreNil()
    .observeNext { print("ContentOffset: \($0)") }


贡献

欢迎fork和提交pull请求!!

在提交pull请求之前,请确保您已经通过了包含的测试。
如果您的pull请求包含新功能,请为它编写测试用例。


许可协议

DelegateProxy 在 MIT 许可协议下发布。