根据Swift中的事件数据触发多个委托

时间:2016-11-15 08:19:20

标签: ios swift socket.io

我是斯威夫特的新手。我正在与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)                                                
                            }
                        }            
                }
            }
        }
    }    

这是最好的方法吗?我发现它有点麻烦。

0 个答案:

没有答案