我要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
}
}