一尘不染

在iphone范围内搜索设备ip地址的优化方法

algorithm

我遇到的情况是-我必须搜索路由器的IP地址,而且我知道它的范围是163.289.2.0到163.289.2.255。我知道这不是搜索的好方法。

for i in 1... 255 {

var str = "163.289.2." + "i"
var tempIP = Ping.getIPAddress(str)

if(tempIP == true)
{
   break;
}

}

现在我的问题是我的自定义类Ping.getIPAddress() 花费3秒
来获取给定IP值的结果。因此,进行255次搜索大约需要765秒(12.75分钟)。我限制搜索应在最多2分钟内完成。所以无论如何我可以使用swift在iPhone中实现这一点。

我只能使用此自定义函数Ping.getIPAddress(),如果给定的IP地址存在,则该函数为true,否则为false。

请提供示例或参考或解决此问题的方法。

在MaxConcurrentOperationCount设置为10的情况下使用NSOperationQueue会很好吗?


阅读 210

收藏
2020-07-28

共1个答案

一尘不染

同步方式

如果Ping.getIPAddress(str)仅在上一个呼叫完成后才执行对每个呼叫,那么我们需要等待(3秒* 256)= 768秒。

在此处输入图片说明

异步方式

另一方面,我们可以对进行多个并发调用Ping.getIPAddress(str)

在此处输入图片说明

假平班

这是我创建的用于测试您的功能的类。

class Ping {
    class func getIPAddress(str:String) -> Bool {
        sleep(3)
        return str == "163.289.2.255"
    }
}

如您所见,该类确实等待3秒钟(以模拟您的情况),然后true仅在传递的ip是时才返回163.289.2.255。这使我可以复制最坏的情况。

这是我准备的课

class QuantumComputer {

    func search(completion:(existingIP:String?) -> ()) {
        var resultFound = false
        var numProcessed = 0
        let serialQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL)
        for i in 0...255 {

            dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_UTILITY.value), 0)) {
                var ip = "163.289.2." + "\(i)"
                let foundThisOne = Ping.getIPAddress(ip)

                dispatch_async(serialQueue) {
                    if !resultFound {
                        resultFound = foundThisOne
                        numProcessed++
                        if resultFound {
                            completion(existingIP:ip)
                        } else if numProcessed == 256 {
                            completion(existingIP: nil)
                        }
                    }
                }
            }
        }
    }
}

该类执行 256异步调用Ping.getIPAddress(...)

256个异步闭包的结果由以下代码处理:

dispatch_async(serialQueue) {
    if !resultFound {
        resultFound = foundThisOne
        numProcessed++
        if resultFound {
             completion(existingIP:ip)
        } else if numProcessed == 256 {
             completion(existingIP: nil)
        }
    }
}

上一个代码块(从第2行到第9行)在我的队列中执行serialQueue。此处256个不同的闭包 同步 运行。

  1. 这对于确保一致地访问变量resultFound和至关重要numProcessed
  2. 另一方面,从 性能的 角度来看,这不是问题,因为该代码非常快(只是一堆算术运算)

测试

这就是我从标准ViewController调用它的方式。

class ViewController: UIViewController {
    var computer = QuantumComputer()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        debugPrintln(NSDate())
        computer.search { (existingIP) -> () in
            debugPrintln("existingIP: \(existingIP)")
            debugPrintln(NSDate())
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

结论

最后,这是我在iOS模拟器上对其进行测试时的输出。请注意,这是最坏的情况(因为最后检查的号码是有效的IP)。

2015-09-04 20:56:17 +0000
"existingIP: Optional(\"163.289.2.255\")"
2015-09-04 20:56:29 +0000

只有12秒!

希望这可以帮助。

2020-07-28