我正在设计一个Swift API,在其中定义了一个名为
因此,该协议的任何实现都应该调用完成处理程序,并返回失败的事件和/或成功的事件。
EventTransmitter
的协议,其中包含一个传输一批Events
的方法。处理一批Events
可能会以成功和失败的事件列表结束。因此,该协议的任何实现都应该调用完成处理程序,并返回失败的事件和/或成功的事件。
public enum EventResult {
/// When the event was transmitted correctly.
case success([Event])
/// When the event failed and should be discarded
case failure([Event])
}
public protocol EventTransmitter {
func transmit(events: [Event], completion: @escaping (EventResult) -> Void)
}
在上述协议中,实现该协议的人必须调用两次完成处理程序:
public class HTTPTransmitter: EventTransmitter {
public func transmit(events: [Event], completion: @escaping (EventResult) -> Void) {
let failedEvents = ...
let successEvents = ...
completion(.failure(failedEvents))
completion(.success(successEvents))
}
}
使用方法如下
transmitter.transmit(events: events, completion: { result in
switch result {
case .success(let events):
// handle success events
case .failure(let events):
// handle failed events
}
})
需要要求多次调用一个完成闭包吗?
还是为每种情况设置不同的闭包更合适:
public protocol EventTransmitter {
typealias EventCallback = (([Event]) -> Void)
func transmit(events: [Event], onSuccess: @escaping EventCallback, onFailure: @escaping EventCallback)
}
EventResult
封装单个事件的结果,并使闭包接受[EventResult]
。 如果原始事件的顺序对回调接收方很重要,则可能会更喜欢这种方法。 - vacawama事件
数量相同的结果
数。并且可以看到每个事件
是成功还是失败。 - Fogmeister