Ping多个主机并根据响应创建单独的UIImageView

时间:2018-08-10 20:52:03

标签: swift ping

我要ping通不同的主机(例如google.com,apple.com,amazon.com),并根据结果(成功或失败),将图像显示为相同的连接状态视图。 / p>

当我仅ping一次主机状态时,一切正常。但是,由于我将发送多个主机,因此每个主机都需要多个UIImageViews。所以我想我需要在回调函数中定义一个参数,或者我需要创建UIImageView并由该函数返回它。

我不确定该怎么做,因为我使用的是用Objective-c编写的SimplePing框架。

迅速4

import UIKit

class ServerVC: BaseViewController, SimplePingDelegate {
    var displayString = ""
    var pinger: SimplePing?

    let imageError = UIImage(named: "error")
    let imageConnected = UIImage(named: "check")
    var statusImage: UIImage!

    @IBOutlet weak var serverLbl: UILabel!
    var ServerImg = UIImageView()
    @IBOutlet weak var updateBtn: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()       

        serverImg = UIImageView(frame: CGRect(x: self.view.center.x, y: 200, width: 50, height: 50))
        serverImg.image = UIImage(named: "error")
        self.view.addSubview(serverImg)

        start(hostname: "www.apple.com")

// INFO: here I want statusImage which is defines below in the callback being set as the image of my UIImageView "serverImg":

        serverImg.image = statusImage
    }

    @objc func updateBtn(sender: UIButton!){
        print("refresh server status")
        start(hostname: "www.apple.com")
        serverImg.image = statusImage
    }

    func start(hostname: String) {
        displayString.removeAll()
        NSLog("start")
        let pinger = SimplePing(hostName: hostname)
        self.pinger = pinger
        pinger.addressStyle = .icmPv4
        pinger.delegate = self
        pinger.start()
    }

    func stop() {
        NSLog("stop")
        self.pinger?.stop()
        self.pinger = nil
    }

    func sendPing() {
        self.pinger!.send(with: nil)
    }

    func simplePing(_ pinger: SimplePing, didStartWithAddress address: Data) {
        NSLog("pinging %@", ServerVC.displayAddressForAddress(address))
        self.sendPing()
    }

    public func simplePing(pinger: SimplePing, didStartWithAddress address: NSData) {
        pinger.send(with: nil)
    }

    func simplePing(_ pinger: SimplePing, didFailWithError error: Error) {
        NSLog("failed: %@", ServerVC.shortErrorFromError(error as NSError))
        displayString.append("failed: \(ServerVC.shortErrorFromError(error as NSError))\n")

// INFO: here I which image has to be set as "statusImage":
        statusImage = imageError!
        self.stop()
    }

    func simplePing(_ pinger: SimplePing, didSendPacket packet: Data, sequenceNumber: UInt16) {
        NSLog("#%u sent", sequenceNumber)
        displayString.append("#\(sequenceNumber) sent\n")
    }

    func simplePing(_ pinger: SimplePing, didFailToSendPacket packet: Data, sequenceNumber: UInt16, error: Error) {
        NSLog("#%u send failed: %@", sequenceNumber, ServerVC.shortErrorFromError(error as NSError))
        displayString.append("#\(sequenceNumber) send failed: \(ServerVC.shortErrorFromError(error as NSError))\n")

// INFO: here I which image has to be set as "statusImage":
        statusImage = imageError!

    }

    private func simplePing(_ pinger: SimplePing, didReceivePingResponsePacket packet: Data, sequenceNumber: UInt16) {
        NSLog("#%u received, size=%zu", sequenceNumber, packet.count)
        displayString.append("#\(sequenceNumber) received, size=\(packet.count)\n")

// INFO: here I which image has to be set as "statusImage":

        statusImage = imageConnected!
    }

    func simplePing(_ pinger: SimplePing, didReceiveUnexpectedPacket packet: Data) {
        NSLog("unexpected packet, size=%zu", packet.count)
        displayString.append("unexpected packet, size=\(packet.count)\n")

// INFO: here I which image has to be set as "statusImage":

        statusImage = imageError!
    }

    static func displayAddressForAddress(_ address: Data) -> String {
        var hostStr = [Int8](repeating: 0, count: Int(NI_MAXHOST))

        let success = getnameinfo(
            (address as NSData).bytes.bindMemory(to: sockaddr.self, capacity: address.count),
            socklen_t(address.count),
            &hostStr,
            socklen_t(hostStr.count),
            nil,
            0,
            NI_NUMERICHOST
            ) == 0
        let result: String
        if success {
            result = String(cString: hostStr)
        } else {
            result = "?"
        }
        return result
    }

    static func shortErrorFromError(_ error: NSError) -> String {
        if error.domain == kCFErrorDomainCFNetwork as String && error.code == Int(CFNetworkErrors.cfHostErrorUnknown.rawValue) {
            if let failureObj = error.userInfo[kCFGetAddrInfoFailureKey as String] {
                if let failureNum = failureObj as? NSNumber {
                    if failureNum.int32Value != 0 {
                        let f = gai_strerror(failureNum.int32Value)
                        if f != nil {
                            return String(cString: f!)
                        }
                    }
                }
            }
        }
        if let result = error.localizedFailureReason {
            return result
        }
        return error.localizedDescription
    } 
}

0 个答案:

没有答案