同步方式
如果
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个不同的闭包 同步 运行。
- 这对于确保一致地访问变量
resultFound
和至关重要numProcessed
; - 另一方面,从 性能的 角度来看,这不是问题,因为该代码非常快(只是一堆算术运算)
测试
这就是我从标准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秒!
希望这可以帮助。



