0

我有一个实用程序类来处理套接字,并且在套接字委托方法中我可以知道套接字的当前状态,例如 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 制作它?

4

2 回答 2

0

也许ReactiveSwiftMutableProperty提供的可以满足你。你的意图很像KVO机制在 Objective-C 中可以做的事情,而 Swift 没有。但是,类实现了相同的功能,有人可以观察到这些功能的变化。 希望下面的demo可以让你理解最简单的使用方式和用法。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)
}
于 2016-12-13T05:13:01.270 回答
0

我通过使用 ReactiveSwift 提供的函数“combineLatest”实现了我的目标。

首先,宣布两个 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.valuerac_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
            }
    }
}
于 2016-12-13T05:34:30.010 回答