簡體   English   中英

Swift SimplePing 不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM