首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在iphone中搜索某个范围内的设备ip地址的优化方法

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

Stack Overflow用户
提问于 2015-09-02 23:29:51
回答 1查看 767关注 0票数 16

我遇到过这样的情况:我必须搜索**路由器**的IP地址,而我只知道它的范围是从163.289.2.0到163.289.2.255。我知道这不是一个好的搜索方式。

代码语言:javascript
复制
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会更好吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-05 05:23:07

同步方法

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

异步方法

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

冒充Ping类

这是我为测试你的功能而创建的一个类。

代码语言:javascript
复制
class Ping {
    class func getIPAddress(str:String) -> Bool {
        sleep(3)
        return str == "163.289.2.255"
    }
}

正如您所看到的,该类确实等待了3秒钟(以模拟您的场景),然后仅当传递的ip163.289.2.255时才返回true。这允许我复制最坏的情况。

解决方案

这是我准备的课程

代码语言:javascript
复制
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个异步闭包的结果由以下代码处理:

代码语言:javascript
复制
dispatch_async(serialQueue) {
    if !resultFound {
        resultFound = foundThisOne
        numProcessed++
        if resultFound {
             completion(existingIP:ip)
        } else if numProcessed == 256 {
             completion(existingIP: nil)
        }
    }
}

前面的代码块(从第2行到第9行)在我的队列serialQueue中执行。在这里,256个不同的闭包运行synchronously.

这对于确保对变量resultFoundnumProcessed;

  • on的一致访问至关重要。另一方面,从performance的角度来看,这不是问题,因为此代码非常快(只是一堆算术运算)

测试

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

代码语言:javascript
复制
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)。

代码语言:javascript
复制
2015-09-04 20:56:17 +0000
"existingIP: Optional(\"163.289.2.255\")"
2015-09-04 20:56:29 +0000

只有12秒!

希望这能有所帮助。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32357266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档