[英]Swift SimplePing doesn't work
我正在使用 SimplePing 來獲取我的 swift 應用程序中的延遲,但我沒有得到任何結果。
這是從 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
所有結果都為零(resultCallBack、pingClient 和 dateReference)。 我做了一項研究來解決這個問題,我發現了一個與我類似的問題,但在目標 c 中。
有人可以幫我嗎?
SimplePingClient
的簽名SimplePingClient
試圖實現的SimplePingDelegate
協議不匹配。 也許這些曾經在某個早期版本中匹配過,但是從 Swift 5/XCode 12.2 開始,並且使用Apple 的 SimplePing 代碼最后更新的 2016 年他們沒有。 某些數據類型錯誤,某些參數標簽不匹配,某些參數丟失。 這意味着SimplePingClient
永遠不會得到它的回調,因為SimplePing
在委托對象中尋找匹配的簽名,沒有找到,並跳過回調。
此外,因為SimplePing.h
這些委托方法聲明為可選的,所以不會出現編譯器錯誤。
要查看錯誤並讓 XCode 為您編寫協議存根,請在SimplePing.h
(第 142 行)的SimplePingDelegate
定義中SimplePing.h
。
以下是我需要對SimplePingClient
類擴展進行的更改,以使 SimplePingClient 正常工作:
extension SimplePingClient: SimplePingDelegate {
public func simplePing(_ pinger: SimplePing, didStartWithAddress address: Data) {
pinger.send(with: nil)
}
public func simplePing(_ pinger: SimplePing, didFailWithError error: Error) {
resultCallback?(nil)
}
public func simplePing(_ pinger: SimplePing, didSendPacket packet: Data, sequenceNumber:UInt16) {
dateReference = Date()
}
public func simplePing(_ pinger: SimplePing, didFailToSendPacket packet: Data, sequenceNumber: UInt16, error: Error) {
pinger.stop()
resultCallback?(nil)
}
public func simplePing(_ pinger: SimplePing, didReceiveUnexpectedPacket packet: Data) {
pinger.stop()
resultCallback?(nil)
}
public func simplePing(_ pinger: SimplePing, didReceivePingResponsePacket packet: Data, sequenceNumber:UInt16) {
pinger.stop()
guard let dateReference = dateReference else { return }
//timeIntervalSinceDate returns seconds, so we convert to milis
let latency = Date().timeIntervalSince(dateReference ) * 1000
resultCallback?(String(format: "%.f", latency))
}
}
會不會是 simplePingClient 超出范圍的情況? 在這種情況下,simplePing 將關閉。 嘗試聲明為全局變量:
var simplePingClient : SimplePingClient!
然后這應該有效:
simplePingClient = SimplePingClient()
simplePingClient.pingHostname("www.apple.com") { latency in
print("Your latency is \(latency ?? "unknown")")
self.labelTempsReponse?.text = latency
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.