ReactiveCocoa 5.0 如何处理回调?
How to deal with callbacks in ReactiveCocoa 5.0?
我有一个实用程序 class 来处理套接字,在套接字委托方法中我可以知道套接字的当前状态,例如didConnected、didReadData 等。我确实不想编写一个带有委托的额外协议来发送套接字状态。
实际上,我的实用程序中有 2 个属性 class,一个用于区分套接字当前状态的枚举:didConnected、didReadData、didDisconnected,另一个是数据类型值存储从套接字接收到的数据。喜欢:
public enum SocketState {
case unknown, didConnected, didReconnectedFailed, didSentHeartbeatPack,
didSentMessage, didReadData, didDisconnected
}
private var currentState: SocketState = .unknown
private var msgData = Data()
成为socket的delegate后,实现了几个方法,
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制作?
也许 ReactiveSwift 提供的 MutableProperty
可以让你满意。你的意图很像 KVO 机制在 Objective-C 中可以做的,而 Swift 没有。但是,MutableProperty
class 实现了相同的功能,某些人可以观察到更改。
希望下面的demo能让你明白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([=11=])
}
msgData.producer.startWithValues {
// doSomething(withData [=11=])
}
我已经通过使用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.value或rac_mas.value,如:
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
rac_state.value = .didDisconnected
}
最后,让controller中的observer监听combined SignalProducer,代码如下:
func configTCPListen() {
tcpManager.rac_SocketStateChanged
.startWithValues { [weak self = self] (tuple) in
switch tuple.0 {
case .didDisconnected:
print("TCP has disConnected!")
default: break
}
}
}
我有一个实用程序 class 来处理套接字,在套接字委托方法中我可以知道套接字的当前状态,例如didConnected、didReadData 等。我确实不想编写一个带有委托的额外协议来发送套接字状态。
实际上,我的实用程序中有 2 个属性 class,一个用于区分套接字当前状态的枚举:didConnected、didReadData、didDisconnected,另一个是数据类型值存储从套接字接收到的数据。喜欢:
public enum SocketState {
case unknown, didConnected, didReconnectedFailed, didSentHeartbeatPack,
didSentMessage, didReadData, didDisconnected
}
private var currentState: SocketState = .unknown
private var msgData = Data()
成为socket的delegate后,实现了几个方法,
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制作?
也许 ReactiveSwift 提供的 MutableProperty
可以让你满意。你的意图很像 KVO 机制在 Objective-C 中可以做的,而 Swift 没有。但是,MutableProperty
class 实现了相同的功能,某些人可以观察到更改。
希望下面的demo能让你明白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([=11=])
}
msgData.producer.startWithValues {
// doSomething(withData [=11=])
}
我已经通过使用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.value或rac_mas.value,如:
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
rac_state.value = .didDisconnected
}
最后,让controller中的observer监听combined SignalProducer,代码如下:
func configTCPListen() {
tcpManager.rac_SocketStateChanged
.startWithValues { [weak self = self] (tuple) in
switch tuple.0 {
case .didDisconnected:
print("TCP has disConnected!")
default: break
}
}
}