我使用SimplePing来获取快速应用程序中的延迟但我没有得到任何结果。
这是在SO中的示例代码:
import Foundation
public typealias SimplePingClientCallback = (String?)->()
public class SimplePingClient: NSObject {
static let singletonPC = SimplePingClient()
private var resultCallback: SimplePingClientCallback?
private var pingClinet: SimplePing?
private var dateReference: NSDate?
public static func pingHostname(hostname: String, andResultCallback callback: SimplePingClientCallback?) {
singletonPC.pingHostname(hostname, andResultCallback: callback)
}
public func pingHostname(hostname: String, andResultCallback callback: SimplePingClientCallback?) {
resultCallback = callback
pingClinet = SimplePing(hostName: hostname)
pingClinet?.delegate = self
pingClinet?.start()
}
}
extension SimplePingClient: SimplePingDelegate {
public func simplePing(pinger: SimplePing, didStartWithAddress address: NSData) {
pinger.sendPingWithData(nil)
}
public func simplePing(pinger: SimplePing, didFailWithError error: NSError) {
resultCallback?(nil)
}
public func simplePing(pinger: SimplePing!, didSendPacket packet: NSData!) {
dateReference = NSDate()
}
public func simplePing(pinger: SimplePing!, didFailToSendPacket packet: NSData!, error: NSError!) {
pinger.stop()
resultCallback?(nil)
}
public func simplePing(pinger: SimplePing, didReceiveUnexpectedPacket packet: NSData) {
pinger.stop()
resultCallback?(nil)
}
public func simplePing(pinger: SimplePing!, didReceivePingResponsePacket packet: NSData!) {
pinger.stop()
guard let dateReference = dateReference else { return }
//timeIntervalSinceDate returns seconds, so we convert to milis
let latency = NSDate().timeIntervalSinceDate(dateReference) * 1000
resultCallback?(String(format: "%.f", latency))
}
}
要在我的viewController中调用SimplePing,我会这样做:
let simplePingClient = SimplePingClient()
simplePingClient.pingHostname("www.apple.com") { latency in
print("Your latency is \(latency ?? "unknown")")
self.labelTempsReponse?.text = latency
}
当我在这一行放置一个断点时:
simplePingClient.pingHostname("www.apple.com") { latency in
所有结果都是nil(resultCallBack,pingClient和dateReference)。我做了一个研究来解决这个问题,我找到了一个类似于我的question,但是在目标c中。
有人可以帮我吗?
答案 0 :(得分:1)
SimplePingClient
中的签名与它试图实现的SimplePingDelegate
协议不匹配。也许这些曾经在某些早期版本中匹配过,但是从Swift 5 / XCode 12.2开始并使用Apple's SimplePing code到最近一次更新是在2016年,但是没有。某些数据类型错误,某些参数标签不匹配以及某些参数缺失。这意味着SimplePingClient
永远不会获得其回调,因为SimplePing
在委托对象中寻找匹配的签名,找不到任何签名,然后跳过回调。
此外,由于SimplePing.h
将这些委托方法声明为可选,因此不会出现编译器错误。
要查看错误并让XCode提供为您编写协议存根的方法,请在SimplePingDelegate
的{{1}}定义中注释掉@optional(第142行)。
这是对SimplePing.h
类扩展的更改,我需要进行这些更改才能使SimplePingClient工作:
SimplePingClient
答案 1 :(得分:0)
var simplePingClient : SimplePingClient!
然后这应该有效:
simplePingClient = SimplePingClient()
simplePingClient.pingHostname("www.apple.com") { latency in
print("Your latency is \(latency ?? "unknown")")
self.labelTempsReponse?.text = latency
}