在iphone中search范围内的设备IP地址的优化方式

我有情况,在我必须search**路由器**的IP地址,我知道只有它的范围是从范围163.289.2.0到163.289.2.255。 我知道这是不好的方式来search。

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次search大约需要765秒(12.75分钟)。 我有限制,search应该在2分钟内完成。 所以,无论如何,我可以使用swift在iPhone中实现这一点。

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

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

用MaxConcurrentOperationCount设置为10的NSOperationQueue会好吗?

同步方法

如果我们只在前一个完成之后才执行每个对Ping.getIPAddress(str)调用,我们需要等待(3秒* 256)= 768秒。

在这里输入图像说明

asynchronous方法

另一方面,我们可以对Ping.getIPAddress(str)执行多个并发呼叫。

在这里输入图像说明

假坪类

这是我创build的一个类来testing你的function。

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

正如你所看到的类等待3秒(模拟你的场景),然后返回true只有当传递的ip163.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) } } } } } } } 

该类对Ping.getIPAddress(...)执行256个asynchronous调用

256个asynchronousclosures的结果由这个代码处理:

 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. 这对确保对variablesresultFoundnumProcessed的一致访问numProcessed ;
  2. 另一方面,从性能angular度来看,这不是一个问题,因为这个代码非常快(只是一堆算术运算)

testing

这就是我从标准的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模拟器上testing的输出。 请注意,这是最糟糕的情况(因为上次检查的号码是有效的IP)。

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

只有12秒!

希望这可以帮助。