我是斯威夫特的新手。我正在与Socket.IO一起尝试实施聊天。我创建了一个委托协议,它定义了一些函数:
@objc protocol EvDelegate {
optional func didAuth(with user: User)
optional func didAuth(with error: Error)
optional func didReceive(message: Message)
optional func didReceive(error: Error)
}
我还创建了Event enum
:
enum Event: String {
case auth = "auth"
case message = "message"
var allEvents: [Event] {
return [.auth, .message]
}
}
我已经实现了EventManager
,它注册了多个委托并监听事件:
class EvManager {
var delegates: [String: EvDelegate]
func add(delegate: EvDelegate, withKey key) {
delegates[key] = delegate
}
func listen() {
// listen for Socket.IO events
for event in Event.allEvents {
socket.on(event.rawValue) { data, ack in
// trigger the associated delegate **[HOW?]**
}
}
}
}
我通过Socket.IO
从服务器获得的数据json具有以下结构:
{ status: true, responseData: { ... } }
或
{ status: false, error: "Some kind of error message" }
我应该如何根据从服务器获取的数据继续触发委托?我知道我应该从delegates
数组中获取每个元素并调用其中一个委托函数,但是我无法确定应该调用哪个函数以及如何创建它的参数。如您所见,在EvDelegate
协议中,每个委托函数都有一个对象作为参数,应根据响应状态和响应数据自动创建。此外,您可以想象,委托协议将包含更多功能。
请指导我。
更新:
这就是我想象的listen
方法看起来
func listen() {
// listen for Socket.IO events
for event in Event.allEvents {
socket.on(event.rawValue) { data, ack in
switch event {
case .auth:
if let user = SomeParser.fetchUser(data: data) {
for listener in listeners {
lister.didAuth?(with: user)
}
} else {
let error = SomeParser.findError(data: data)
for listener in listeners {
listener.didAuth?(with: error)
}
}
}
}
}
}
这是最好的方法吗?我发现它有点麻烦。