//
|
// NSObject+RACSelectorSignal.h
|
// ReactiveCocoa
|
//
|
// Created by Josh Abernathy on 3/18/13.
|
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
|
//
|
|
#import <Foundation/Foundation.h>
|
|
@class RACSignal;
|
|
/// The domain for any errors originating from -rac_signalForSelector:.
|
extern NSString * const RACSelectorSignalErrorDomain;
|
|
/// -rac_signalForSelector: was going to add a new method implementation for
|
/// `selector`, but another thread added an implementation before it was able to.
|
///
|
/// This will _not_ occur for cases where a method implementation exists before
|
/// -rac_signalForSelector: is invoked.
|
extern const NSInteger RACSelectorSignalErrorMethodSwizzlingRace;
|
|
@interface NSObject (RACSelectorSignal)
|
|
/// Creates a signal associated with the receiver, which will send a tuple of the
|
/// method's arguments each time the given selector is invoked.
|
///
|
/// If the selector is already implemented on the receiver, the existing
|
/// implementation will be invoked _before_ the signal fires.
|
///
|
/// If the selector is not yet implemented on the receiver, the injected
|
/// implementation will have a `void` return type and accept only object
|
/// arguments. Invoking the added implementation with non-object values, or
|
/// expecting a return value, will result in undefined behavior.
|
///
|
/// This is useful for changing an event or delegate callback into a signal. For
|
/// example, on an NSView:
|
///
|
/// [[view rac_signalForSelector:@selector(mouseDown:)] subscribeNext:^(RACTuple *args) {
|
/// NSEvent *event = args.first;
|
/// NSLog(@"mouse button pressed: %@", event);
|
/// }];
|
///
|
/// selector - The selector for whose invocations are to be observed. If it
|
/// doesn't exist, it will be implemented to accept object arguments
|
/// and return void. This cannot have C arrays or unions as arguments
|
/// or C arrays, unions, structs, complex or vector types as return
|
/// type.
|
///
|
/// Returns a signal which will send a tuple of arguments upon each invocation of
|
/// the selector, then completes when the receiver is deallocated. `next` events
|
/// will be sent synchronously from the thread that invoked the method. If
|
/// a runtime call fails, the signal will send an error in the
|
/// RACSelectorSignalErrorDomain.
|
- (RACSignal *)rac_signalForSelector:(SEL)selector;
|
|
/// Behaves like -rac_signalForSelector:, but if the selector is not yet
|
/// implemented on the receiver, its method signature is looked up within
|
/// `protocol`, and may accept non-object arguments.
|
///
|
/// If the selector is not yet implemented and has a return value, the injected
|
/// method will return all zero bits (equal to `nil`, `NULL`, 0, 0.0f, etc.).
|
///
|
/// selector - The selector for whose invocations are to be observed. If it
|
/// doesn't exist, it will be implemented using information from
|
/// `protocol`, and may accept non-object arguments and return
|
/// a value. This cannot have C arrays or unions as arguments or
|
/// return type.
|
/// protocol - The protocol in which `selector` is declared. This will be used
|
/// for type information if the selector is not already implemented on
|
/// the receiver. This must not be `NULL`, and `selector` must exist
|
/// in this protocol.
|
///
|
/// Returns a signal which will send a tuple of arguments on each invocation of
|
/// the selector, or an error in RACSelectorSignalErrorDomain if a runtime
|
/// call fails.
|
- (RACSignal *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol;
|
|
@end
|