ios - 在 iPhone 中搜索某个范围内的设备 IP 地址的优化方法

标签 ios iphone algorithm swift search

我有这样的情况,我必须搜索 **路由器 ** 的 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 分钟内完成。那么无论如何我可以在 iPhone 中使用 swift 实现这一点。

我必须仅使用此自定义函数 Ping.getIPAddress(),如果给定的 IP 地址存在则返回 true,否则返回 false。

请提供解决此问题的示例或引用或方法。

使用 NSOperationQueue 并将 MaxConcurrentOperationCount 设置为 10 会好吗?

最佳答案

同步方法

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

enter image description here

异步方法

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

enter image description here

假Ping类

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

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

如您所见,该类会等待 3 秒(以模拟您的场景),然后仅当传递的 ip163.289.2.255< 时才返回 true/。这使我能够复制最坏的情况。

解决方案

这是我准备的类(class)

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 次异步调用

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. 这对于确保一致地访问变量 resultFoundnumProcessed 至关重要;
  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秒!

希望这对您有所帮助。

关于ios - 在 iPhone 中搜索某个范围内的设备 IP 地址的优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32357266/

相关文章:

arrays - 在具有 O(1) 空间的四个(单独)排序数组中查找中位数

ios - 如何在 MPMoviePlayerController 上添加 UIImageView | iOS | objective-c

iphone - 自定义 UITableViewCell 中的 NSNotification 观察者?

algorithm - 在二维网格中生成单向路径

iphone - iOS 和 Mac 之间的跨平台游戏中心匹配?

iphone - 图标没有出现在 Xcode 存档中?

algorithm - 向图的所有边添加权重 - 生成树和最短路径的变化

html - Bootstrap Modal 按钮不起作用,仅适用于 iOS

ios - UIPickerView 不显示 iOS4 中组件的自定义 View (它在 iOS5 中显示)

ios - 嵌入在 UIContainerView 中的 UICollectionViewController - 如何将数据传递给父级?