如何处理ReactiveCocoa 5.0中的回调?

时间:2016-12-09 06:28:05

标签: swift swift3 reactive-cocoa reactive-cocoa-5

我有一个实用程序类来处理套接字,在套接字委托方法中,我可以知道套接字的当前状态,例如: didConnected,didReadData等等。我不想用委托编写额外的协议来发送套接字状态。

实际上,我的实用程序类中有2个属性,用于区分套接字的当前状态:didConnected,didReadData,didDisconnected,另一个是用于存储从套接字接收的数据的数据类型值。它喜欢:

public enum SocketState {
    case unknown, didConnected, didReconnectedFailed, didSentHeartbeatPack, 
         didSentMessage, didReadData, didDisconnected
}
private var currentState: SocketState = .unknown
private var msgData = Data()

成为套接字的委托后,我实现了几种方法,

func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {}
func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {}
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {}

我打算做的是改变 currentState 的值,或者我确实将接收到的数据设置为 msgData ,在我的控制器中,我可以捕获同时更改的 2 值。

如何使用ReactiveCocoa 5.0制作它?

2 个答案:

答案 0 :(得分:0)

也许 ReactiveSwift 提供的MutableProperty可能会让您满意。你的内涵非常像 KVO 机制在Objective-C中可以做到的,而Swift没有。但是,MutableProperty类实现了相同的功能,可以由某人观察到哪些更改 希望以下演示可以让您了解使用MutableProperty及其用法的最简单方法。

// definition
let currentState: MutableProperty<SocketState> = MutableProperty(.unknown)
let msgData: MutableProperty<Data> = MutableProperty(Data())

// observe changes
currentState.producer.startWithValues { state in
    // process(state)
}
msgData.producer.startWithValues { data in
    // doSomething(withData data)
}

如果删除了冗余显式类型推断,则上述代码将简洁明了。

// definition
let currentState = MutableProperty(.unknown)
let msgData = MutableProperty(Data())

// observe changes
currentState.producer.startWithValues {
    // process($0)
}
msgData.producer.startWithValues {
    // doSomething(withData $0)
}

答案 1 :(得分:0)

我通过使用函数&#34; combineLatest&#34;实现了我的目标。由ReactiveSwift提供。

首先,宣布两个MutableProperty的变量和一个SignalProducer,如下所示:

private var rac_state = MutableProperty<SocketState>(.unknown)
private var rac_msg = MutableProperty<Data>(Data())
public var rac_SocketStateChanged: SignalProducer<(SocketState, Data), NoError> {
    return SignalProducer.combineLatest(rac_state.producer, rac_msg.producer)
}

然后,在套接字委托方法中更改 rac_state.value rac_mas.value ,例如:

func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
    rac_state.value = .didDisconnected
}

最后,让控制器中的观察者听组合SignalProducer ,这里是代码:

func configTCPListen() {
    tcpManager.rac_SocketStateChanged
        .startWithValues { [weak self = self] (tuple) in
            switch tuple.0 {
            case .didDisconnected:
                print("TCP has disConnected!")
            default: break
            }
    }
}